4

假设我想将应用程序中所有 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 主题化的最佳方法是什么?

4

2 回答 2

3

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

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

<Style TargetType="{x:Type local:MyStackPanel}" 
       BasedOn="{StaticResource {x:Type StackPanel}}" />
于 2012-09-06T19:19:41.640 回答
0

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

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

<UserControl DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <StackPanel Background="{Binding Path=Background}">
    ...
    </StackPanel>
</UserControl>
于 2012-09-06T18:25:02.093 回答