【问题标题】:Style.TargetType, dialog and subclassing WPF controlsStyle.TargetType、对话框和子类化 WPF 控件
【发布时间】:2012-08-31 13:01:58
【问题描述】:

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

【问题讨论】:

标签: c# wpf xaml wpf-controls themes


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,不过,我不想这样下去。原因是需要额外的工作,而且不灵活。例如,我将无法向堆栈面板添加控件。
  • 虽然这不适用于 StackPanel 示例:设计与本机主题不匹配的内置 WPF 主题也不是好习惯。微软在 Windows 8 上违反了它,并认为它很棒。所以我们必须在我们的应用程序中解决这个问题。对于所有控件。
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢。弹出对话框/窗口中的控件怎么样?有没有办法在不复制样式的情况下应用相同的外观和感觉?
  • @David 如果将样式放在Application.Resources 中,它们应该会应用于弹出对话框或其他窗口中的控件。否则,您可以将所有样式放在一个资源文件中,然后在每个主要部分中简单地导入该文件,例如Window.Resources
  • 是否可以在 MyStackPanel 中执行此操作?
  • @David 是的,因为它继承自 StackPanel,您必须将其添加到 StackPanel.Resources
  • 我试过了,不行。样式应用于子控件,但不应用于包含该样式的控件。
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 2012-05-06
相关资源
最近更新 更多