Können WPF Themen verwendet werden, um mehrere Skin für eine Anwendung enthalten, die zur Laufzeit geändert werden kann?

StackOverflow https://stackoverflow.com/questions/844388

Frage

WPF ermöglicht eine Steuer Bibliothek unterschiedliche Ressourcen Wörterbücher für unterschiedliche System Themen zur Verfügung zu stellen, im Wesentlichen eine Anwendung ermöglicht das Betriebssystem des ausgewählten visuellen Thema passen (Aero, Luna, etc).

Ich frage mich, wenn ich mehrere Thema Ressourcen Wörterbücher mit meiner Anwendung und nutzen einige bestehende Theme-Unterstützung im Rahmen umfassen kann. Dies sollte für mein eigenes Thema Namen arbeiten und ermöglichen im Idealfall der Benutzer das Thema zu ändern und damit die Haut Aussehen der Anwendung zur Laufzeit. Auch wenn dies nur eine Konfigurationseinstellung, könnte es noch interessant sein.

War es hilfreich?

Lösung

Hier ist ein Ausschnitt von Code, den ich in meiner Anwendung, die Thematisierung unterstützt. In diesem Beispiel habe ich zwei Themen (Standard und Classic XP). Die Themen Ressourcen gespeichert sind, in der DefaultTheme.xaml und ClassicTheme.xaml sind.

Dies ist der Standard-Code in meinem App.xaml

<Application ...>
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="ArtworkResources.xaml" />
                <ResourceDictionary Source="DefaultTheme.xaml" />
            </ResourceDictionary.MergedDictionaries>

            <Style x:Key="SwooshButton" TargetType="ButtonBase">
                <!-- style setters -->
            </Style>

            <!-- more global styles -->
        </ResourceDictionary>
    </Application.Resources>
</Application>

Dann in dem Code hinter der App.xaml Ich habe die folgende Methode zum Ändern des Themas zu ermöglichen. Im Grunde, was Sie tun, ist klar, dass die Ressource Wörterbücher und dann das Wörterbuch mit dem neuen Thema neu zu laden.

    private Themes _currentTheme = Themes.Default;
    public Themes CurrentTheme
    {
        get { return _currentTheme; }
        set { _currentTheme = value; }
    }

    public void ChangeTheme(Themes theme)
    {
        if (theme != _currentTheme)
        {
            _currentTheme = theme;
            switch (theme)
            {
                default:
                case Themes.Default:
                    this.Resources.MergedDictionaries.Clear();
                    AddResourceDictionary("ArtworkResources.xaml");
                    AddResourceDictionary("DefaultTheme.xaml");
                    break;
                case Themes.Classic:
                    this.Resources.MergedDictionaries.Clear();
                    AddResourceDictionary("ArtworkResources.xaml");
                    AddResourceDictionary("ClassicTheme.xaml");
                    break;
            }
        }
    }

    void AddResourceDictionary(string source)
    {
        ResourceDictionary resourceDictionary = Application.LoadComponent(new Uri(source, UriKind.Relative)) as ResourceDictionary;
        this.Resources.MergedDictionaries.Add(resourceDictionary);
    }

Was Sie auch im Auge mit diesem Ansatz zu halten brauchen, ist, dass alle Stile, die ein Thema verwenden müssen eine dynamische Ressource haben. Zum Beispiel:

<Window Background="{DynamicResource AppBackgroundColor}" />

Andere Tipps

Ich weiß nicht, von einem Weg, dies im Rahmen tun, aber Sie können es tun, wenn Sie jeden Steuer Stil, der sich ändern kann.

Die Theorie ist, um den Stil eines DynamicResource zu machen und dann die ResourcesDictionary laden auf der Basis der Benutzer-Konfiguration für die anderen Stil.

Hier ist ein Artikel, der ein Beispiel hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top