ResourceDictionary zur Laufzeit ändern

  • WPF

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    ResourceDictionary zur Laufzeit ändern

    Hallo,

    ich habe momentan folgendes Problem.
    Wir wollen anfangen unser komplettes Programm auf WPF umzustellen. Um einen einheitliche Look für alle Benutzeroberflächen zu bekommen habe ich nun ein Projekt mit dem Namen Styling erstellt.
    In diesem Projekt befinden sich eigentlich nur ResourceDictionaries.
    Alle anderen Projekte binden dieses Projekt ein. Im XAML-Editor kann ich ein Dictionary ja ganz einfach über

    XML-Quellcode

    1. <Window.Resources>
    2. <ResourceDictionary Source="pack://application:,,,/Styling;component/NormalerStyle.xaml"/>
    3. </Window.Resources>


    einbinden.

    Nun wollen wir den Benutzern aber eine Auswahlmöglichkeit geben.
    Ich hab das ganze einfach mal mit einem Button getestet. Beim Klicken auf den Button soll das Design gewechselt werden.

    VB.NET-Quellcode

    1. Me.Resources.Clear()
    2. Dim s As System.IO.Stream = Application.GetResourceStream(New System.Uri("/Styling;component/BlueStyle.xaml", UriKind.RelativeOrAbsolute)).Stream
    3. Dim dict = DirectCast(System.Windows.Markup.XamlReader.Load(s), ResourceDictionary)
    4. Me.Resources.Add("BlueStyle", dict)


    Dem Button ist über "DynamicResource" ein ButtonStyle zugewiesen. Der Button Style hat in beiden Dictionaries denselben Namen.

    Der Button wird dann auch blau. So wie er in "BlueStyle" definiert ist. Er bleibt allerdings nicht so. Sondern wechselt kontinuierlich die Farbe zwischen Control(Die standard Farbe, welche auch in "NormalStyle" festgelegt ist) und Blau (In "BlueStyle" definiert).

    Hab ich dort einen Denkfehler oder hat wer eine Idee, wie man dies geschickter lösen kann?
    Kann das leider erst morgen machen wenn ich wieder in der Arbeit bin.
    Hab zuhause gerade mal versucht ein Testprojekt zu erstellen. Aber da funktioniert das irgendwie gar nicht. Bekomms nichtmal hin ein RessourcenDictionary aus einem anderen Projekt zu importieren.

    Aber alleine das Importieren aus einem anderen Projekt ist irgendwie schon extrem seltsam.

    Manchmal funktioniert es so:

    XML-Quellcode

    1. <ResourceDictionary Source="pack://application:,,,/Styling;component/NormalerStyle.xaml"/>

    Manchmal nur so:

    XML-Quellcode

    1. <ResourceDictionary Source="/Styling;component/NormalerStyle.xaml"/>


    Gibt es unter WPF keine einfachere Möglichkeit ein ResourceDictionary für alle Projekte zu verwenden?
    Wenn ich eines erstelle und das dann zu einem Projekt hinzufüge wird ja eine lokale Kopie davon erstellt. Wenn ich jetzt Einstellungen ändere werden diese ja auch nur in der lokalen Kopie geändert und nicht in allen Projekten.
    Es führt ja eigentlich gar kein Weg daran vorbei ein extra Projekt zu erstellen, auf welches dann alle anderen Projekte verweisen.
    Denn nur so sind alle Projekte betroffen wenn ich eine Einstellung ändere.

    Edit:
    So habe jetzt mal ein Beispielprojekt hinzugefügt.

    Edit2:
    Die ResourceDictionaries müssen bei Buildvorgang Page haben. Sonst werden sie beim Starten der Anwendung nicht gefunden und es kommt zu einem Fehler.

    Edit3:
    Projekt entfernt

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „KillaChris“ ()

    So ich habe jetzt nochmal ein bisschen rumprobiert.
    Wie gesagt die Styles habe ich auf den Buildvorgang Page gestellt, da es sonst beim Starten zu einem Fehler kommt.
    In meinem Styling Projekt habe ich mir eine Klasse geschrieben, die das ResourceDictionary lädt und zurückgibt.

    Die Form übernimmt den Style auch (Der Button wird grün). Aber irgendwie wechselt der Button kontinuierlich die Farbe.
    Dateien
    • WPFTest.zip

      (156,39 kB, 189 mal heruntergeladen, zuletzt: )
    Wir haben das eben an 2 Pcs ausprobiert.
    Der Button wird grün und wechselt die ganze Zeit die Farbe. Solange das Fenster den Focus hat.
    Wird der Focus aber auf ein anderes Fenster gesetzt dann bleibt der Button grün.

    Edit:
    Hab das jetzt mal mit 2 Buttons getestet. Der zweite Button bleibt tatsächlich grün. Aber der erste Button (Mit dem Klick-Event wechselt). Klicke ich nun auf den zweiten Button dann fängt der zweite Button das wechseln an und der erste Button bleibt grün. Hat wohl scheinbar was mit dem Focus des Buttons zu tun Ö_o

    Edit2:
    Wenn man Focusable auf False setzt hört das Flimmern auf.
    Trotzdem seltsam das der Button nach dem Klicken die ganze Zeit den Focus behält.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „KillaChris“ ()

    ich kann mir das garnet vorstellen "wechselt die ganze Zeit die Farbe".

    Blinkert der da von selbst herum, also ist die erste Sekunde grau, dann 1s grün, dann 1s lila usw.?

    ich hab nämlich grad was hingebastelt, wo ich die resources durchschalten kann, also von grau auf grün auf blau auf grau, eben genau die Resources, die da sind.