为自定义控件创建默认样式

时间:2009-08-06 08:28:02

标签: wpf controls styling

我正在创建一个自定义控件(基于WPF DataGrid)。我想要做的是在datagrid上设置默认样式。目前我正在设置Style属性。但是当我创建一个改变fx的样式时,我的问题就出现了。主应用程序app.xaml中的背景颜色。然后,我的所有“默认”样式都将丢失,并且DataGrid仅在设置了背景属性时才显示所有标准。

我尝试在网格上的每个属性上使用OverrideMetadata,我想要应用默认值但没有运气。我也尝试在构造函数中设置每个属性,但由于属性优先,因此主应用程序中的样式永远不会被应用。

有什么想法吗?

提前致谢

2 个答案:

答案 0 :(得分:13)

您是否在static构造函数中设置了此内容?

DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomType), new FrameworkPropertyMetadata(typeof(MyCustomType)));

此外,您的资源样式的键是否等于自定义控件的类型?

即使将TargetType设置为您的控件,也不能有其他键设置。

大会还应标有以下属性:

[assembly: ThemeInfo(
    //where theme specific resource dictionaries are located
    //(used if a resource is not found in the page, 
    // or application resource dictionaries)
    ResourceDictionaryLocation.None, 

    //where the generic resource dictionary is located
    //(used if a resource is not found in the page, 
    // app, or any theme specific resource dictionaries)
    ResourceDictionaryLocation.SourceAssembly 
)]

答案 1 :(得分:5)

如果创建没有字典键的样式,它将设置您在导入样式字典的范围内指定的所有类型的对象(如果在Window.Resources中指定它,它将具有该窗口的范围) ...如果你在App.xaml中指定它...你得到的图片。)

  <Style TargetType="{x:Type Button}">
    <Setter Property="FontFamily" Value="Times New Roman" />
    <Setter Property="FontSize" Value="30" />
    <Setter Property="FontWeight" Value="Bold" />
    <Setter Property="Background" Value="#FFCA5132" />
  </Style>

这将给他们所有相同的风格。

这是一个非常强大的功能。它允许您设置任何对象的样式,而不仅仅是UI元素。你可以设置一个数据实体,例如“Person”对象,当这些元素在视觉上使用时,比如将Person类型列表数据绑定到ListView,所有这些都将按照你指定的方式设置样式,即使它们是不是原生的UI元素。这就是WPF对其控件“看起来”的看法。