我观察到,在MergedDictionaries
标记内定义自定义按钮样式时,样式仅应用于控件的第二个(以及所有其他实例)实例。
当我省略MergedDictionaries
并继续ResourceDictionary
标记时,就不会发生这种情况。
奇怪的是,Visual Studio(2015)设计师展示了我的预期外观 - 它只是在运行时才发生错误。
<Window x:Class="WpfApplication5.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<Style x:Key="mybutton" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border BorderBrush="Red" BorderThickness="1" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style BasedOn="{StaticResource mybutton}" TargetType="{x:Type Button}" />
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<StackPanel>
<Button Height="100" />
<Button Height="50" />
</StackPanel>
</Window>
请注意,这是一个完全空白的模板,而不是上面的XAML:
答案 0 :(得分:1)
根据此链接,您没有使用MergedDictionaries: https://msdn.microsoft.com/en-us/library/system.windows.resourcedictionary.mergeddictionaries.aspx?f=255&MSPPError=-2147217396
“通过向MergedDictionaries引用的泛型集合添加ResourceDictionary来合并字典。合并的ResourceDictionary在标记中没有在其中定义的资源元素。相反,合并的字典是没有定义标记子元素的ResourceDictionary(或者没有通过代码添加的元素),但是为Source指定了一个URI。“
您可以轻松编写如下样式:
<Window x:Class="WpfApplication5.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Window.Resources>
<Style x:Key="mybutton" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border BorderBrush="Red" BorderThickness="1" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style BasedOn="{StaticResource mybutton}" TargetType="{x:Type Button}" />
</Window.Resources>
<StackPanel>
<Button Height="100" />
<Button Height="50" />
</StackPanel>
</Window>