【发布时间】:2010-11-09 00:26:58
【问题描述】:
我试图在我的 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)样式被忽略,就好像后者(window)样式已覆盖它一样。设置了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>
对本案如何补救有什么建议吗?
【问题讨论】:
-
如果您尝试为窗口创建新的默认样式或控制您声明的第二个样式,则该假设是正确的。在您的特定示例中,默认样式的两个属性都将被覆盖新的默认样式。如果没有继承原始样式的任何属性,则可能会出现不同的问题。您是否有机会动态更改样式属性?
-
@Jeff:我根本没有动态更改样式。事实上,这些是当前在整个应用程序中定义的唯一样式,所以我看不出还有什么可以干扰的。我仍然想知道我是否误解了样式系统...
-
只是为了确认,为 App 中的样式设置
x:Key并将 Window 的样式基于它工作得很好。我正在寻找一种方法来避免这种情况,也许使用另一个绑定说明符。 -
检查我更新的答案,看看是否有帮助。
标签: wpf xaml inheritance styles