2015-07-02 115 views
0

使用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> 

有什么办法,我可以让我的控制,拿起了ListBoxItemGeneric.xaml一个单独的样式:,所以当我编辑默认控件模板的副本不包括为ListBoxItem风格?

编辑

需要通知自定义控件来查找默认样式信息。这是在它的静态构造函数由负责的依赖属性设置默认值来完成:

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

我们不能改变它ListBoxItem,不幸的是,因为A)它大概会影响到所有ListBoxItem S和B)的尝试导致异常(因为它已经设置)。

一条途径可能是创建一个DerivedListBoxItem并以与DerivedListBox相同的方式应用默认样式。问题随即成为:

  1. ListBox告知使用ListBoxItem秒( 模板只是有一个ItemsPresenter元素)?
  2. DerivedListBoxItem替换它的适当方法是什么?
  3. 这是否可能会导致控制消费者的任何不良副作用?

进一步编辑...

似乎有上ListBox,设置的风格接受ItemContainerStyle类型和产生新的项目保护方法的属性:

[StyleTypedProperty(Property = "ItemContainerStyle", StyleTargetType = typeof(ListBoxItem))] 
public class ListBox : Selector 
{ 
    ... 
    protected override DependencyObject GetContainerForItemOverride() 
    { 
    return new ListBoxItem(); 
    } 

不幸的是,这似乎不是整个故事。我已经更改/覆盖了两个参考DerivedListBoxItem,但该样式未应用,并试图编辑ItemContainerStyle的现有版本的空白版本或副本,结果出现错误“复制样式失败”。

回答

0

为什么不提供每个样式模板的关键字然后单独使用它?

<Style TargetType="{x:Type local:DerivedListBox}" x:Key="customListBoxStyleKey"> 
    <Setter Property="Template">...</Setter> 
</Style> 

<ItemTemplate x:Key="customListBoxItemStyleKey"> 
    ... 
</ItemTemplate> 

然后使用它是这样的:

<local:DerivedListBox Style="{StaticResource customListBoxStyleKey}" 
         Itemtemplate="{StaticResource customListBoxItemStyleKey}"> 
</local:DerivedListBox> 
+0

感谢响应。 'Generic.xaml'的意义在于它为自定义控件创建了默认样式。在XAML中创建控件实例时,您不需要指定样式,模板等,并获得此默认值。这对消费者的易用性很重要。我想知道的是,如果我可以为'Style'和'ItemContainerStyle'指定相互独立的默认值。框架控件有单独的默认值,所以我假设它必须是可能的... –