我正在为我的大多数窗口创建一个基窗口类来派生。显然,最好的解决方案是一个单独的类,以及适用于它的样式。
问题是<Style ../>
I have 在App.Resources
. 也就是说,如果它是在 external 中定义的ResourceDictionary
,并合并到App.xaml
's 资源中,或者是本地字典并合并,或者内联到App.Resources
. 但是,当<Style ../>
它被放入时应用Themes/Generic.xaml
。
除了覆盖DefaultStyleKeyProperty
.
下面是ThemeWindow
:
public class ThemeWindow : Window
{
static ThemeWindow()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(ThemeWindow), new FrameworkPropertyMetadata(typeof(ThemeWindow)));
}
}
<Style ../>
这是我尝试应用的非常简单的方法(它使Window
背景变为红色,仅此而已):
<Style TargetType="{x:Type testing:ThemeWindow}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type testing:ThemeWindow}">
<Grid>
<Grid.Background>
<SolidColorBrush Color="Red"/>
</Grid.Background>
<AdornerDecorator>
<ContentPresenter />
</AdornerDecorator>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
MainWindow
使用,的ThemeWindow
就是下面的 XAML:
<testing:ThemeWindow x:Class="Testing.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:testing="clr-namespace:Testing"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="Button" HorizontalAlignment="Left" Margin="125,83,0,0" VerticalAlignment="Top" Width="75"/>
</Grid>
</testing:ThemeWindow>
现在,如前所述,如果您将其Style
放在它自己的ResourceDictionary
中,并像这样包含它:
<App.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Themes/ThemeWindow.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</App.Resources>
.. 这没用。如果将样式直接内联到App.Resources
中,则不起作用。
我发现它工作的唯一ResourceDictionary
情况是调用xaml Generic.xaml
,并将其放入Themes/
应用程序的目录中。
我想知道为什么会这样。
我唯一的理论是,当 WPF 看到一个控件类型时,它会转到Themes
,并扫描所有ResourceDictionary
s 以查找该类型,然后返回Generic.xaml
并加载它。<Style />
这并不能解释为什么如果在合并中可用,它不会加载ResourceDictionary
。请注意,如果将MergedDictionary
放入中,它确实有效Generic.xaml
,原因很明显。
如果那是我必须做的,ResourceDictionary
我完全可以不必合并。Generic.xaml
我只是想了解一下为什么它需要这样的技术细节。
这个不工作/工作的截图: