通过 WPF 中的绑定动态设置资源样式

Posted

技术标签:

【中文标题】通过 WPF 中的绑定动态设置资源样式【英文标题】:Setting resource styles dynamically through binding in WPF 【发布时间】:2011-09-08 16:30:28 【问题描述】:

我正在尝试使我的应用程序的配色方案动态化,以便我可以在确定我的应用程序配色方案的属性(希望来自数据库)中拥有一个颜色值。

我有一个 Resources.xaml 文件,我在其中设置应用程序的颜色和样式,然后在我的所有控件和窗口中使用它们。我想将资源文件中 SolidColorBrush 的颜色绑定到我的 ViewModel(s) 中的属性,以便此颜色可以根据当前应用程序值进行更改。这是我到目前为止所拥有的,但它不起作用,所以我一定错过了一些东西。

Resources.xaml 文件中的代码:

<SolidColorBrush x:Key="ApplicationMainBackgroundBrush" Color="Binding Path=MainApplicationColor, RelativeSource=RelativeSource FindAncestor, AncestorLevel=1, AncestorType=x:Type ApplicationArchitecture:ViewModelBase, Mode=FindAncestor, FallbackValue=CornflowerBlue"/>  

MainWindow.xaml 文件中的代码:

<Grid Grid.Row="0" x:Name="gridControl" Background="DynamicResource ApplicationMainBackgroundBrush">

我的 MainWindow.xaml 的 DataContext 是一个名为 ApplicationViewModel 的类,它继承自 ViewModelBase,它有一个属性“MainApplicationColor”,返回字符串“Teal”,以改变 SolidColorBrush 的颜色,使其与 FallbackValue 不同。我现在正在对颜色进行硬编码,但这是我希望将来从数据库中获取我的价值的地方。颜色目前没有改变,所以我假设我的绑定源有问题,因为它显然没有像我认为的那样工作。

谢谢,

克拉拉

【问题讨论】:

【参考方案1】:

问题似乎出在您的SolidColorBrush.Color 属性的Binding 上。

    那里的祖先类型应该是ApplicationArchitecture:MainWindow不是 ApplicationArchitecture:ViewModelBase

    路径中应包含DataContext

像这样……

  <SolidColorBrush x:Key="ApplicationMainBackgroundBrush"
                   Color="Binding Path=DataContext.MainApplicationColor,
                              RelativeSource=RelativeSource FindAncestor, 
                                  AncestorType=x:Type ApplicationArchitecture:MainWindow,
                                      Mode=FindAncestor,
                                          FallbackValue=CornflowerBlue"/>

如果这有帮助,请告诉我。

【讨论】:

我正在尝试使其尽可能通用/灵活,以便我的所有应用程序都可以使用它(资源文件位于公共库中)所以我不想设置我当前用作 AncestorType 的窗口,因为它不是不同应用程序中的同一个对象,甚至不是使用该样式的同一应用程序中的不同窗口/控件。无论如何设置绑定到我的 ViewModelBase 中的属性,或者指定它在当前 ViewModel 中查找使用此样式的任何控件的绑定,以便它尽可能灵活?谢谢! 在实际绑定到 MainWindow 时不需要删除祖先级别,因为它不能有另一个 MainWindow 类型的祖先,实际上 AncestorLevel 的默认值已经是 1,因此删除它没有任何作用. @klarat,你可以用通用的Window 替换ApplicationArchitecture:MainWindow,假设你的任何应用程序的最终父级是Window 类型。 @AngelWPF:这不太正确,您也可以让浏览器托管 WPF 应用程序... 谢谢,成功了!我将 AncestorType 设置为 Window ,然后关键是路径指向 DataContext.MainApplicationColor 正如@AngelWPF 建议的那样,以便它从绑定的视图模型中获取它。再次感谢。

以上是关于通过 WPF 中的绑定动态设置资源样式的主要内容,如果未能解决你的问题,请参考以下文章

依赖属性

在WPF中的Combobox中绑定

WPF 精修篇 依赖属性

DataTemplate WPF 中样式设置器中的绑定

05《Vue 入门教程》Vue 动态样式绑定

WPF/Silverlight的问题:在后台代码动态生成的控件,怎么设置动态样式 Style="DynamicResource sbStyle