为什么不根据HeaderedItemsControl工作看不出风格?

时间:2017-01-16 19:13:25

标签: c# wpf xaml

因此,如果我创建一个继承自ContentControl的无外观控件,然后将其样式放在Generic.xaml文件中,我需要将BasedOn={StaticResource {x:Type ContentControl}}添加到样式中才能使其工作。但是,当我使用从HeaderedItemsControl继承的无外观控件做同样的事情时,我得到一个运行时异常,说“

  

{"找不到名为' System.Windows.Controls.HeaderedItemsControl'的资源。资源名称区分大小写。"}

这很奇怪,因为它在那个命名空间中

enter image description here

示例代码:

不能工作

<Style TargetType="{x:Type myControl}" 
BasedOn="{StaticResource {x:Type HeaderedItemsControl}}">

<Style TargetType="{x:Type myContentControl}">

工作

<Style TargetType="{x:Type myControl}">

<Style TargetType="{x:Type myContentControl}" 
BasedOn="{StaticResource {x:Type ContentControl}}">

我的问题是,为什么他们没有处理相同的事情?这是语言中的错误吗?

2 个答案:

答案 0 :(得分:1)

你是对的。按照惯例,WPF控件的默认主题样式应该在名为Generic.xaml的ResourceDictionary中定义,该文件夹名为由程序集的ThemeInfo属性指定的程序集的主题文件夹,其中定义了控件类型。有关详细信息,请参阅Ian Griffiths的博客:https://www.interact-sw.co.uk/iangblog/2007/02/14/wpfdefaulttemplate

HeaderedItemsControl虽然没有定义主题样式,但这就是为什么你得到一个异常,因为你不能将Style基于另一个不存在的Style。

HeaderedItemsControl使用与它继承的ItemsControl相同的默认主题样式,因此可以使用:

<Style TargetType="{x:Type local:myControl}" BasedOn="{StaticResource {x:Type ItemsControl}}" />

答案 1 :(得分:-1)

所以我怀疑是爆炸的原因是HeaderedItemsControl在初始化时具有null默认样式。它实际上在documentation on MSDN中说明了这一点。

  

属性值类型:System.Windows.Style

     

应用于为每个元素生成的容器元素的样式   项目。默认值为null。

而ContentControl确实有默认样式,如MSDN documentation

中所示

我无法在任何地方找到此问题并且错误非常模糊。但是,我认为我的结论是合理的。