我想为UserControl
提供一个简单的默认样式,但在使用控件时仍然能够扩展或覆盖样式。以下是包含控件的简单UserControl
和Window
的示例方案。目的是使Button
中提供的Window
样式覆盖UserControl
中定义的默认样式。
用户控件
<UserControl x:Class="Sample.TestControl" ... >
<UserControl.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="Margin" Value="2" />
<Setter Property="Foreground" Value="Orange" />
</Style>
<Style TargetType="{x:Type StackPanel}">
<Setter Property="Background" Value="Black" />
</Style>
</UserControl.Resources>
<StackPanel>
<Button Content="Press Me" />
<Button Content="Touch Me" />
<Button Content="Tap Me" />
</StackPanel>
</UserControl>
窗口
<Window x:Class="Sample.MainWindow" ... >
<Grid>
<local:TestControl>
<local:TestControl.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="Margin" Value="2" />
<Setter Property="Foreground" Value="Green" />
</Style>
</local:TestControl.Resources>
</local:TestControl>
</Grid>
</Window>
问题
以上代码将导致:
Set property 'System.Windows.ResourceDictionary.DeferrableContent' threw an exception.
Item has already been added.
上面的代码试图将两个具有相同键的样式提交到同一个ResourceDictionary
中,所以很明显它不会起作用。我的猜测是我无法为按钮提供默认样式......
答案 0 :(得分:0)
解决方法不足:覆盖默认ResourceDictionary
<Window x:Class="Sample.MainWindow" ... >
<Grid>
<local:TestControl>
<local:TestControl.Resources>
<ResourceDictionary>
<Style TargetType="{x:Type Button}">
<Setter Property="Margin" Value="2" />
<Setter Property="Foreground" Value="Green" />
</Style>
</ResourceDictionary>
</local:TestControl.Resources>
</local:TestControl>
</Grid>
</Window>
通过将自定义Button
样式放在ResouceDictionary
中,我可以覆盖默认样式。但是,它不仅覆盖了Button
样式,而且覆盖了所有资源。因此,StackPanel
将不再具有黑色背景。 (显然我可以将其添加到最重要的风格中,但这在更大的范围内并不实用。)