2015-07-02 154 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'指定相互獨立的默認值。框架控件有單獨的默認值,所以我假設它必須是可能的... –