继承自应用程序样式(WPF)

时间:2009-07-08 12:05:51

标签: wpf xaml inheritance styles

我正在尝试为我的WPF应用程序中的某个Window继承应用程序级样式,但是我无法继承而不是简单地覆盖现有样式。

App.xaml (在App.Resources element下)我定义了一个样式:

<Style TargetType="Button">
    <Setter Property="Padding" Value="6"/>
    <Setter Property="FontWeight" Value="Bold"/>
</Style>

在某个Window的XAML论坛中,我在Window.Resources下定义了以下内容:

<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
    <Setter Property="Padding" Value="6"/>
    <Setter Property="FontWeight" Value="Bold"/>
</Style>

这里的问题是前一个(app)样式被忽略,好像后一个(窗口)样式已经覆盖了它。设置了BasedOn属性,用于表示应该继承现有样式,据我所知。删除属性也无济于事。我能想到的唯一潜在原因是{StaticResource {x:Type Button}}仅指默认的WPF样式,而不是我在 App.xaml 中定义的样式。

我知道使用x:Key属性可以实现这种样式行为,但我希望有一种更优雅的方式,允许我将带继承的样式应用于范围内的所有控件(即应用程序) /窗口)。

更新

感谢您的回复。你确实在样本应用程序中按预期工作是对的。不同之处在于我无意中没有提到App.xaml中的样式包含在ResourceDictionary中,因此:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>

            <ResourceDictionary Source="SettingsDictionary.xaml"/>

            <ResourceDictionary>

                <Style x:Key="DefaultButton" TargetType="Button">
                    <Setter Property="Padding" Value="4"/>
                    <Setter Property="HorizontalAlignment" Value="Center"/>
                    <Setter Property="VerticalAlignment" Value="Center"/>
                </Style>

            </ResourceDictionary>

        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

关于在这种情况下如何纠正问题的任何建议?

2 个答案:

答案 0 :(得分:5)

修改

经过一些研究,我发现如果设置了TargetType,则会自动生成x:Key。所以,App.xaml中的样式是正确的。但是,wpf设计器缺乏一些资源处理技能,并且不显示这两种样式。如果您构建并运行项目,则将应用这两种样式。

如果您的计算机和VS2008的行为与我测试您的代码的行为相同。

希望这有帮助。

编辑2

App.xaml中的资源和合并词典一直很古怪。 我通过将第一个样式声明移出合并字典来解决问题,如下所示:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>

            <!--<ResourceDictionary Source="SettingsDictionary.xaml"/>-->

        </ResourceDictionary.MergedDictionaries>

        <Style TargetType="Button">
            <Setter Property="Foreground" Value="Red"/>
            <Setter Property="Padding" Value="4"/>
            <Setter Property="HorizontalAlignment" Value="Center"/>
            <Setter Property="VerticalAlignment" Value="Center"/>
        </Style>

    </ResourceDictionary>
</Application.Resources>

另请注意,为样式提供除{x:Type Button}以外的显式设置键将使其成为非默认样式,并使其不会自动应用。

通常建议仅为来自其他文件的资源指定合并字典,并在默认空间中指定编码资源,如上所述。

答案 1 :(得分:1)

我的第二个杰夫韦恩斯对于你的方法没有按照预期的方式感到惊讶而发表评论。事实上,我无法通过以下步骤重现您的问题:

  • 通过VS 2008 C#WPF应用程序向导创建了一个新项目。
    • 导致App.xaml和Window1.xaml就像您的示例
  • 从工具箱添加了一个标准按钮到Window1。
  • 按原样粘贴您的代码段,分别修改了一个属性,以便首先观察所需的效果(具有相同的属性/值,而不是您想要演示的内容)。

嗯,这只是工作正常,即Window1中的按钮继承了两种样式的属性,并且在任何一种中修改属性都会正确影响按钮。因此,它们必须是项目/环境中幕后的怪异事物?你有没有试过这样一个简单的repro案例?