2

HandledWindow現在、標準型のテンプレートを含む XAML の基本スタイルに取り組んでいます。スタイルには、色、フォント、その他の変数など、後でスタイルで再利用するいくつかのローカル リソースが含まれています。

ユーザーのUI設定を考えていたので、色やサイズなどを好きなように変更できます。しかし、ローカル リソースを変更してもスタイル自体は変更されず、現在のインスタンスのみが変更されることがHandledWindowわかりました。アプリケーションで実行中のウィンドウよりも多くのウィンドウが存在する可能性があるため、UI 設定には適していません。

次に、変数をクラスのテンプレートに相対的にバインドする必要があることに気付きましたHandledWindow。これには、すべての変更可能な設定がパブリックおよび静的プロパティとして含まれます。しかしPropertyChanged、インスタンスに対してのみ機能するイベントを発生させることができないため、静的プロパティ バインディングで問題が発生しました。また、ウィンドウはスタイル自体を更新しません。

さらに、スタイルを反応させ、再起動せずにその場ですぐに更新しようとしています。

4

1 に答える 1

1

WPF は「リソース中心」です。リソースですべての UI スタイル、ブラシ、およびテンプレートを定義すると、実行時に、言及したすべてのプロパティを含むアプリケーション全体のテーマ変更を非常に簡単に有効にすることができます。SettingsViewModel を介して設定ウィンドウからメッセージを受信した後、MainViewModel でそれを行う方法は次のとおりです。

private void ApplyTheme()
{          
    Application.Current.Resources.MergedDictionaries.Clear();

    var rd = new ResourceDictionary { { "Locator", locator } };
    Application.Current.Resources.MergedDictionaries.Add(rd);

    switch (theme)
    {
        case "Blue":
            Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Office_Blue;component/Themes/System.Windows.xaml", UriKind.RelativeOrAbsolute) });
            Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Office_Blue;component/Themes/Telerik.Windows.Controls.GridView.xaml", UriKind.RelativeOrAbsolute) });
            Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Office_Blue;component/Themes/Telerik.Windows.Controls.Input.xaml", UriKind.RelativeOrAbsolute) });
            Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Office_Blue;component/Themes/Telerik.Windows.Controls.Navigation.xaml", UriKind.RelativeOrAbsolute) });
            Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Office_Blue;component/Themes/Telerik.Windows.Controls.xaml", UriKind.RelativeOrAbsolute) });
            break;
        case "Summer":
            Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Summer;component/Themes/System.Windows.xaml", UriKind.RelativeOrAbsolute) });
            Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Summer;component/Themes/Telerik.Windows.Controls.GridView.xaml", UriKind.RelativeOrAbsolute) });
            Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Summer;component/Themes/Telerik.Windows.Controls.Input.xaml", UriKind.RelativeOrAbsolute) });
            Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Summer;component/Themes/Telerik.Windows.Controls.Navigation.xaml", UriKind.RelativeOrAbsolute) });
            Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("/Telerik.Windows.Themes.Summer;component/Themes/Telerik.Windows.Controls.xaml", UriKind.RelativeOrAbsolute) });
            break;
        }
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("Resources/Brushes.xaml", UriKind.RelativeOrAbsolute) });
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("Resources/ControlTemplates.xaml", UriKind.RelativeOrAbsolute) });
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("Resources/DataTemplates.xaml", UriKind.RelativeOrAbsolute) });
        Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("Resources/Styles.xaml", UriKind.RelativeOrAbsolute) });
    }

明らかに、私は Telerik コントロールを使用しているので、それらの辞書をロードしますが、メソッドの下部で、ブラシ、スタイルなどの独自のリソースもロードしていることに気付くでしょう。

結論として、WPF を使用すると、アプリケーション全体のテーマの変更が非常に簡単になります。

于 2013-11-15T03:31:56.600 に答える