Style.TargetType,对话框和子类化WPF控件

时间:2012-09-06 16:42:59

标签: c# wpf xaml wpf-controls themes

让我们说我想在我的应用程序中将所有StackPanel的背景设置为某种颜色。 我在App.xaml中得到了以下内容:

<Style TargetType="StackPanel">
    <Setter Property="Background" Value="#222222" />
</Style>

仅当StackPanel是纯StackPanel且StackPanel必须位于App下时才会起作用。但是,弹出对话框中StackPanel或StackPanel的子类的背景颜色不会因此而更改。例如:

public class MyStackPanel : StackPanel { ... }

解决子类化问题的一种方法是扩展UserControl,并将StackPanel嵌入到UserControl中。只要您不需要访问StackPanel的属性,这就没问题。

有什么想法吗?

进行WPF主题的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以为自定义类创建一个隐式样式,该样式继承自基类的样式

<Style TargetType="StackPanel">
    <Setter Property="Background" Value="#222222" />
</Style>

<Style TargetType="{x:Type local:MyStackPanel}" 
       BasedOn="{StaticResource {x:Type StackPanel}}" />

答案 1 :(得分:0)

覆盖WPF控件不是一个好习惯。正如您所提到的,您需要为此设计一个UserControl后代。

您可以将StackPanel的属性(在UserControl中)绑定到UserControl后代的属性,您可以将其添加到代码中或添加到UserControl的内置属性中。

<UserControl DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <StackPanel Background="{Binding Path=Background}">
    ...
    </StackPanel>
</UserControl>