在WPF中创建UI设置的正确方法是什么?

时间:2013-11-15 01:58:53

标签: c# wpf xaml data-binding settings

我现在正在使用XAML中的基础样式,其中包含我的标准HandledWindow类型的模板。 该样式包括几个本地资源,如颜色,字体和其他变量,以便以后的风格重用。

我正在考虑用户的UI设置,因此他可以根据自己的意愿更改颜色和尺寸等内容。 但后来我发现更改本地资源不会改变样式本身,只会改变当前的HandledWindow实例,所以它不适合UI设置,因为在应用程序中可能会有更多运行窗口。

然后我意识到我必须将变量相对于我的HandledWindow类的模板绑定,这将包括所有可更改的设置为public& amp;静态属性。但后来我遇到了静态属性绑定的问题,因为我无法引发仅适用于实例的PropertyChanged事件。窗口本身不会更新它的样式。

此外,我正在尝试使样式做出反应并立即更新,而无需重新启动。

1 个答案:

答案 0 :(得分:1)

WPF是“以资源为中心的”。您可以在资源中定义所有UI样式,画笔和模板,并且在运行时,可以非常轻松地启用应用程序范围的主题更改,其中包含您提及的所有属性。以下是我在MainViewModel中通过其SettingsViewModel从我的设置窗口收到消息之后的操作:

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,应用程序范围内的主题更改变得更加容易。