使用ListBox
,我可以独立控制模板的“编辑副本...”和生成的项目容器的模板(样式为ListBoxItem
) - 相关的默认样式获取将其复制到我想要的任何地方,我很乐意去。WPF自定义控件:更改附加模板默认值
我创建了一个从ListBox
派生的自定义控件,并修改了这两个模板的默认值,并将它们放入Themes/Generic.xaml
。不幸的是,我可以找得到该项目的容器风格应用使用自定义的控制时,唯一的办法就是通过使主风格二传手:
<Sty1e TargetType="{x:Type local:DerivedListBox}">
<Setter Property="Template">...</Setter>
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Sty1e TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">...</Setter>
</Style>
</Setter.Value>
</Setter>
</Style>
我想什么是让他们分开
<Sty1e TargetType="{x:Type local:DerivedListBox}">
<Setter Property="Template">...</Setter>
</Style>
<Sty1e TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">...</Setter>
</Style>
有什么办法,我可以让我的控制,拿起了ListBoxItem
从Generic.xaml
一个单独的样式:,所以当我编辑默认控件模板的副本不包括为ListBoxItem
风格?
编辑
需要通知自定义控件来查找默认样式信息。这是在它的静态构造函数由负责的依赖属性设置默认值来完成:
DefaultStyleKeyProperty.OverrideMetadata(typeof(DerivedListBox), new FrameworkPropertyMetadata(typeof(DerivedListBox)));
我们不能改变它ListBoxItem
,不幸的是,因为A)它大概会影响到所有ListBoxItem
S和B)的尝试导致异常(因为它已经设置)。
一条途径可能是创建一个DerivedListBoxItem
并以与DerivedListBox
相同的方式应用默认样式。问题随即成为:
- 凡
ListBox
告知使用ListBoxItem
秒( 模板只是有一个ItemsPresenter
元素)? - 用
DerivedListBoxItem
替换它的适当方法是什么? - 这是否可能会导致控制消费者的任何不良副作用?
进一步编辑...
似乎有上ListBox
,设置的风格接受ItemContainerStyle
类型和产生新的项目保护方法的属性:
[StyleTypedProperty(Property = "ItemContainerStyle", StyleTargetType = typeof(ListBoxItem))]
public class ListBox : Selector
{
...
protected override DependencyObject GetContainerForItemOverride()
{
return new ListBoxItem();
}
不幸的是,这似乎不是整个故事。我已经更改/覆盖了两个参考DerivedListBoxItem
,但该样式未应用,并试图编辑ItemContainerStyle
的现有版本的空白版本或副本,结果出现错误“复制样式失败”。
感谢响应。 'Generic.xaml'的意义在于它为自定义控件创建了默认样式。在XAML中创建控件实例时,您不需要指定样式,模板等,并获得此默认值。这对消费者的易用性很重要。我想知道的是,如果我可以为'Style'和'ItemContainerStyle'指定相互独立的默认值。框架控件有单独的默认值,所以我假设它必须是可能的... –