12

WPF を使用すると、コントロール ライブラリはさまざまなシステム テーマにさまざまなリソース ディクショナリを提供できます。これにより、基本的に、オペレーティング システムで選択されたビジュアル テーマ (Aero、Luna など) にアプリケーションを一致させることができます。

アプリケーションに複数のテーマ リソース ディクショナリを含めて、フレームワーク内の既存のテーマ サポートを利用できるかどうか疑問に思っています。これは私自身のテーマ名で機能し、理想的にはユーザーがテーマを変更できるようにして、実行時にアプリケーションの外観をスキン化できるようにします。これが構成設定にすぎなかったとしても、興味深いものになる可能性があります。

4

2 に答える 2

14

これは、テーマをサポートするアプリケーションで使用したコードのスニペットです。この例では、2つのテーマ(デフォルトとクラシックXP)があります。テーマリソースは、それぞれDefaultTheme.xamlとClassicTheme.xamlに保存されます。

これは私の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>

次に、App.xamlの背後にあるコードで、テーマを変更できるようにする次のメソッドがあります。基本的には、リソースディクショナリをクリアしてから、新しいテーマでディクショナリをリロードします。

    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);
    }

このアプローチで覚えておく必要があるのは、テーマを利用するスタイルには動的なリソースが必要になるということです。例えば:

<Window Background="{DynamicResource AppBackgroundColor}" />
于 2009-05-10T03:50:59.953 に答える
3

フレームワークでこれを行う方法はわかりませんが、自分で変更できるすべてのコントロールのスタイルを設定すれば、それを行うことができます。

理論は、スタイルをaにしてから、異なるスタイルのユーザー構成に基づいてDynamicResourceロードすることです。ResourcesDictionary

これが例のある記事です。

于 2009-05-10T01:18:46.107 に答える