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