如何在共享的ResourceDictionary中定义窗口实例的默认背景颜色?该问题涉及到IT技术。

7

我似乎无法为我的应用程序中的所有窗口设置默认背景颜色。有人知道怎么做吗?

目前,我正在像这样在我的App.xaml文件中设置主题。

<Application>
    <Application.Resources>
        <ResourceDictionary Source="Themes/SomeTheme.xaml" />

这基本上是为我的整个应用程序设置样式。

SomeTheme.xaml 中,我正在尝试设置所有窗口的默认颜色,如下所示。

<SolidColorBrush Color="{DynamicResource MainColor}" x:Key="CommonBackgroundBrush" />
<Style TargetType="{x:Type Window}">
    <Setter Property="Background" Value="{DynamicResource CommonBackgroundBrush}" />
</Style>

这个语法在Window类型的派生类中完全被忽略。
有没有办法强制应用这个样式到所有的Window派生类中呢?
关于这个语法的奇怪之处是,在VS设计预览窗口中它实际上显示了正确的颜色。
4个回答

7

您的窗口不是Window的实例,它们是从Window派生的类的实例。因此,我认为您需要列出它们所有,但您可以使用BasedOn来帮助。


这是一个好观点...但仍然必须有一些方法来设置从 Window 派生的任何内容。实际上,XAML 预览显示背景被设置了。 - Nicholas
这是设计师工作方式的产物。它确实会实例化一个“Window”,以便您的代码后台不需要编译即可进行设计。 - Rick Sladkey
好吧,谢谢你提供这个信息...那么你的意思是说没有办法强制所有派生类应用它们基类的主题? - Nicholas
我们可以推测,检查类及其所有基类的样式成本太高,否则将添加此功能是明智的选择。 - Rick Sladkey
感谢您的评论...它们给了我很多见解。 - Nicholas

4
如果确实没有实际的继承,那么这可能是你可以做到的最简单的方式:
<Style TargetType="{x:Type Window}">
    <Setter Property="Background">
        <Setter.Value>
            <SolidColorBrush Color="Blue"/>         
        </Setter.Value>
    </Setter>
</Style>
<Style TargetType="{x:Type local:MainWindow}" BasedOn="{StaticResource {x:Type Window}}"/>
<Style TargetType="{x:Type local:Dialogue}" BasedOn="{StaticResource {x:Type Window}}"/>
...

至少这样你不需要复制整个样式。

我认为这是一个不错的选择。很遗憾我必须明确声明它们。 - Nicholas
实际上,我无法使其工作......你确定这是有效的吗? - Nicholas
我尝试了一下,对我来说有效,也许整体主题有所不同。 - H.B.
我会继续调试... 我一定搞错了什么。 - Nicholas
好的,这个确实可以用...似乎在使用MergedDictionaries时有一些神秘的东西。我还没有能够准确定位它,但是当您尝试在ResourceDictionary中声明Styles并将其嵌套在ResourceDictionary.MergedDictionaries中时,事情会变得混乱。 - Nicholas

4

为你的样式添加一个x:Key属性,

<Style x:Key="WindowStyle" TargetType="{x:Type Window}">

然后在适用于每个窗口的地方引用它:

<Window x:Class="WpfApplication1.MainWindow" ... Style="{StaticResource WindowStyle}">

是的,我一直试图避免这个问题。我希望能在一个地方设置样式。 - Nicholas
1
@Nicholas,我想问一下为什么您不想设置样式引用?个人而言,我更喜欢完全控制哪个样式适用于哪个控件,特别是在我遇到这个ButtonStyle事件之后:有一个星期一早上,我来到办公室发现有人搞乱了我的DatePickers的样式。花了我整个上午才弄清楚是我自己搞砸了。在那个星期五之前,我定义了一个默认的按钮样式。但是DatePicker包含一个Button作为PART,样式也被应用到了那里。我决定键是你的朋友,如果不使用它们,则自担风险 :-) - TomBot
键值没有问题。实际上,你的例子很好,但我想避免从每个页面引用样式。我真的想要一个隐式样式,但我猜这是不可能的。通过在类型上设置它(如H.B的示例),我可以在同一资源中集中地为我的页面设置样式...这对我来说是一个有趣的想法。所以,在这种情况下,我并没有跳过键值,只是它们不能给我想要的东西。说实话,针对类型的定位也不能给我想要的东西,但看起来我将不得不接受它。 - Nicholas
如果我要将这个与CSS相关联,我可以全局设置样式,并使用ID和类(在这种情况下是键)覆盖它们。 - Nicholas

2

我对这些都很新,以下是我的观点。 我更改了网格的背景...不确定这样做是否存在问题 :)

 <Style TargetType="{x:Type Grid}">
    <Setter Property="Background" Value="#FFECE9D8"/>
</Style>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接