【问题标题】:Creating default style for custom control为自定义控件创建默认样式
【发布时间】:2009-08-06 08:28:02
【问题描述】:

我目前正在创建一个自定义控件(基于 WPF DataGrid)。我想做的是在数据网格上设置默认样式。目前我正在设置有效的 Style 属性。但是当我创建一种样式来更改 fx 时,我的问题就出现了。主应用程序 app.xaml 中的背景颜色。然后我所有的“默认”样式都丢失了,DataGrid 看起来都是标准的,只有设置了背景属性。

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

有什么想法吗?

提前致谢

【问题讨论】:

  • 您是否尝试在自定义样式中设置“BasedOn”?
  • 嗯,我想过,但为了能够做到这一点,我必须在我的网格控件上创建一个属性以获取默认样式,然后在我创建新样式的 app.xaml 中使用它与基于。我只是认为会有更好的解决方案。使用所有第三方控件,您可以创建新样式并设置一些属性,而无需再次实现完整样式。

标签: wpf controls styling


【解决方案1】:

您是否在static 构造函数中设置了这个?

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

另外,资源 Style 的 Key 是否等于自定义控件的 Type?

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

Assembly 还应标有以下属性:

[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 
)]

【讨论】:

  • 嘿kek444 我试过了,是的,当我包含代码时,网格渲染时什么都没有出现(只是网格应该是的空白空间)。我目前正在尝试使用 BasedOn 自定义样式。
  • 提供的答案中的其他信息。
  • 我实际上没有将键设置为我的控件类型。我已经纠正了这一点,但我仍然得到一个应该出现控件的空白区域。我已经将样式放在了themes/generic.xaml 文件中,并将[assembly: ThemeInfo(ResourceDictionaryLocation.SourceAssembly, ResourceDictionaryLocation.SourceAssembly)] 标记添加到了assemblyinfo 文件中。这和它有什么关系吗?
  • 您需要 1) 在 Themes/Generic.xaml 中设置默认样式,Style 上没有 x:Key 但设置了 TargetType 2) 在控件静态构造函数中设置 DefaultStyleKeyProperty.OverrideMetadata 语句如上3)你不需要像上面那样在程序集ThemeInfo中做任何事情
  • 太棒了,我不明白为什么我的控件没有模板……AssemblyInfo 中的 ThemeInfo 解决了这个问题。
【解决方案2】:

如果您创建一个没有字典键的样式,它将在您导入样式字典的范围内指定您指定类型的所有对象的样式(如果您在 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 对其控件“无视”的原因。

【讨论】:

  • 问题是我创建的默认样式已经在网格的资源字典中没有。问题是,在我的默认样式中,我有: 背景不会是绿色,因为网格资源字典中的默认样式将具有优先级
  • 必须有某种方法为数据网格上的每个属性添加默认值,这样当控件上设置新样式时,我的所有样式都不会被覆盖?
  • 您必须创建另一种样式,并将 BasedOn 属性设置为“DataGrid”并覆盖您要为该特定实例覆盖的那几项内容。
  • 仔细注意“没有字典键”这句话!我自己刚刚研究了一下——原型使用键控样式,当我将新控件添加到基线时忘记删除键——键的存在意味着它永远不会作为默认样式——所以,+1跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多