【问题标题】:How do I define the default background color for window instances in a shared ResourceDictionary?如何在共享 ResourceDictionary 中定义窗口实例的默认背景颜色?
【发布时间】:2011-01-09 19:36:17
【问题描述】:

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

目前我正在像这样在我的 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 设计预览窗口中显示了正确的颜色。

【问题讨论】:

    标签: wpf xaml themes window resourcedictionary


    【解决方案1】:

    您的窗口不是Window 的实例,它们是派生自Window 的类的实例。所以我认为您必须将它们全部列出,但您可以使用BasedOn 来提供帮助。

    【讨论】:

    • 这是一个很好的观点......但是,仍然必须有一些方法来设置从Window 派生的任何内容。事实上,XAML 预览显示了正在设置的背景。
    • 这是设计师工作方式的产物。它确实实例化了一个Window,这样您的代码隐藏就不需要为了进行设计而编译。
    • 该死的。感谢您提供的信息...所以您是说没有办法强制所有衍生产品应用其基类的主题?
    • 我们可以推测,检查类和所有基类的样式成本太高,否则添加它是一个明智的功能。
    • 感谢您的 cmets...他们给了我很多见解
    【解决方案2】:

    如果真的没有真正的继承,这可能会尽可能简单:

    <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}}"/>
    ...
    

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

    【讨论】:

    • 我认为这是一个不错的选择。不幸的是,我必须明确声明这些。
    • 实际上,我无法让它工作......你确定这是有效的吗?
    • 我试过了,它对我有用,也许整体主题有所不同。
    • 我会继续修修补补...我一定是搞砸了
    • 好的,这确实有效......当您使用 MergedDictionaries 时,似乎有某种巫术。无法准确定位,但是当您尝试在嵌套在 ResourceDictionary.MergedDictionaries 中的 ResourceDictionary 中声明样式时,事情会变得很不稳定
    【解决方案3】:

    给你的风格一个x:Key

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

    然后在它应该应用到的每个窗口中引用它:

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

    【讨论】:

    • 是的,我试图避免这种情况。我想在一个地方设置样式。
    • @Nicholas 请问您为什么不想设置样式参考?就我个人而言,我更喜欢完全控制哪种样式适用于哪种控件,尤其是在我发生了 ButtonStyle 事件之后: 一个星期一早上,我来到办公室,发现有人弄乱了我的 DatePickers 的样式。我花了整个上午才发现我自己搞砸了。在我为 Buttons 定义默认样式之前的星期五。但是 DatePicker 包含一个 Button 作为 PART,样式也适用于此。我决定钥匙是你的朋友,跳过它们后果自负:-)
    • 按键没有问题。事实上,你的例子很好,但我想避免从每一页引用样式。我真的想要一种隐式风格,但我想这是不可能的。通过在类型上设置它(如 H.B 的示例),我可以在同一资源中集中设置页面样式......这对我来说是一个有趣的想法。所以不,我没有跳过键,在这种情况下,它们只是没有给我我想要的东西。说实话,定位类型并没有给我想要的东西,但看起来我必须忍受它。
    • 如果我想这与 CSS 相关,我将能够全局设置样式,并用 ids 和 classes.. 在这种情况下为键覆盖它们。
    【解决方案4】:

    我对这一切都不熟悉,所以这是我的 5 便士价值。 我更改了网格的背景...不确定这样做是否有任何问题:)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      相关资源
      最近更新 更多