设置整个窗口的前景色

我想为我的所有元素设置前景(文本)颜色你会认为这很容易,但它不是……

  

这没有任何影响……我能让这个工作的唯一方法就是我专门为每个元素设置Foreground属性。 如果你有数百个元素等,这会很烦人。

也许你知道一种方式?

这是因为LabelCheckBox等控件会覆盖其样式中的Foreground属性。

下面是一个典型的元素逻辑树的示例,它显示了在Window级别指定的值如何沿树向下移动:

 Window (Red [Local]) -> Grid (Red [Inherited]) -> ListBox (Red [Inherited]) -> ListBoxItem (Red [Inherited]) -> StackPanel (Red [Inherited]) -> Label (Black [Style]) -> TextBlock (Black [Inherited]) -> TextBlock (Red [Inherited]) 

在方括号中,显示值的来源。

正如您所看到的那样,inheritance会在Label本身上中断,因为它的Foreground属性设置为默认样式:

  

作为解决方法,我们可以使用以下技巧。 在应用程序中定义此类控件(如Label )的默认样式(在App.xaml或Window inself中)。 并且在该默认样式中覆盖Foreground属性以设置相对源绑定到仍具有所需值的控件的最近祖先:

   

之后,我们的树将如下所示:

 Window (Red [Local]) -> Grid (Red [Inherited]) -> ListBox (Red [Inherited]) -> ListBoxItem (Red [Inherited]) -> StackPanel (Red [Inherited]) -> Label (Red [Binding to StackPanel.(TextElement.Foreground)]) -> TextBlock (Red [Inherited]) -> TextBlock (Red [Inherited]) 

如您所见,我们的绑定恢复了inheritance。

需要为每个在其样式中覆盖Foreground属性的元素定义此类样式。 正如@Duane建议的那样,为了不在每种样式中复制绑定,可以使用BasedOnfunction:

    

希望这可以帮助。

遗憾的是,样式在WPF中的工作方式不能在父类上创建generics样式并使其适用于子类控件。

您可以做的一件事是创建一个基本样式,该基本样式使用您要设置的属性(如ContentControl)定位基本类型,然后为每个基于该样式的控件创建特定样式。 这是一个例子:

             

希望这可以帮助。

编辑:

您可以使用下面的Pavlo方法来恢复inheritance并使其更容易使用,如下所示:

      

至少那时你不必在任何地方复制相同的setter代码(BTW,我认为TextBlock默认inheritance;没有覆盖的默认样式)。

是的,这在wpf中并不容易。但你可以这样试试

         

如果您要配置数百个单独的元素,那肯定会很烦人,但我假设您不会有数百种不同类型的元素。

在这种情况下,您可以做的一件事是为您的类型创建样式,并在那里设置前景色。

理想情况下,这可能在ResourceDictionary ,每个Style都会引用一个共同的前景Color,就像

      

然后将此资源字典应用于需要它的窗口,如: