【发布时间】:2012-01-27 15:38:22
【问题描述】:
我在查看this question 并注意到在Application.Resources 中放置一个隐式TextBlock 样式会将该样式应用于所有TextBlock,甚至是其他控件中的那些,例如Buttons、ComboBoxes 等
<Application.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="Blue" />
</Style>
</Application.Resources>
将隐式样式置于Window.Resources does not cross control template boundaries 中,这样Buttons 和ComboBoxes 之类的内容将保持其默认的黑色文本。
<Window.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="Blue" />
</Style>
</Window.Resources>
此外,在Application.Resources 中添加默认样式可以使您无法用另一种隐式样式覆盖该样式。
<!-- Doesn't work if implicit style with same property is in Application.Resources -->
<ComboBox.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="Red" />
</Style>
</ComboBox.Resources>
我的问题是:
-
这是为什么?
-
Application.Resources和Windows.Resources之间还有其他区别吗? -
什么时候应该使用一个而不是另一个?
我知道
Application.Resources适用于整个应用程序,而Window.Resources仅适用于窗口,但是我想知道为什么Application中的样式与Window中的样式不同
【问题讨论】:
-
关于 App.xaml 的隐式样式如何跨越 ControlTemplate 边界的好问题和见解。因此,我将某些资源字典导入/合并到应用程序的 每个 窗口中(尽管我实际上只是导入了一个主 rd 文件)。你有没有找到比我这样做更好的方法来处理这个问题? (能够只导入一次会更好——就像我们对 App.xaml 的导入资源所做的那样。)
-
这个跨越 ControlTemplate 边界的问题对于像(App.xaml 级别)隐式 TextBlock 样式这样的情况尤其麻烦,其中 TextBlock 自动生成为控件的 ContentPresenter 的子项。使用 Rachel 提到的窗口级技巧为我解决了这个问题。
-
@Jason 通常我的 WPF 应用程序只有一个窗口,内容会根据需要进行更改。我不认为我曾经做过一个超过两个窗口(登录和应用程序)的窗口。也就是说,您可能可以使用 MEF 导入/导出资源字典,如 here 所述
-
谢谢,很高兴知道。