2017-03-08 69 views
5

有時,當我編輯原始模板我不需要改變原有的風格和色彩的控制的一個副本,並想直接引用原有的。編輯WPF控件模板,但使用原來的風格

例如,我想更改ComboBox模板以在下拉列表中添加一些過濾按鈕,其切換按鈕指的是也複製到文件中的樣式。我想參考原始風格,以便我的XAML不會過於混亂。

編輯: 因此,這裏是當你選擇編輯副本創建的XAML代碼的一部分。 的控件模板是什麼,我想改變,但我不需要ComboBoxToggleButton風格,並因此對於切換按鈕,我想它的樣式設置爲一個ComboBoxToggleButton風格是從複製。是否有一些名稱空間全部存儲在它們中,還是無法訪問?

<Style x:Key="ComboBoxToggleButton" TargetType="{x:Type ToggleButton}"> 
    ... 
</Style> 

<ControlTemplate x:Key="ComboBoxTemplate" TargetType="{x:Type ComboBox}"> 
    <Grid x:Name="templateRoot" SnapsToDevicePixels="true"> 
     ... 
     <ToggleButton x:Name="toggleButton" ... Style="{StaticResource ResourceKey=ComboBoxToggleButton}"/> 
    </Grid> 
</ControlTemplate> 

約想什麼我它像

<Window xmlns:baseStyles="{namespace/url to the default wpf styles}"> 
<ControlTemplate x:Key="ComboBoxTemplate" TargetType="{x:Type ComboBox}"> 
    <Grid x:Name="templateRoot" SnapsToDevicePixels="true"> 
     ... 
     <ToggleButton x:Name="toggleButton" ... Style="{StaticResource ResourceKey=baseStyles:ComboBoxToggleButton}"/> 
    </Grid> 
    <ControlTemplate.Triggers> 
     ... 
    </ControlTemplate.Triggers> 
</ControlTemplate> 
+0

可能重複[從默認樣式繼承樣式](http://stackoverflow.com/questions/11581475/inherit-style-from-default-style) –

+0

不,因爲我沒有試圖繼承樣式,我試圖完全刪除複製的樣式,只是引用它所處理的樣式。 –

+0

根據您的進一步解釋,查看答案獲取更多信息。 –

回答

1

對,所以Combobox不是你的基本裸模板控制。在它內部的ControlTemplate是一個獨特的ToggleButton(因此它是額外的特定於實例的樣式模板)。一旦你介紹一個新的ControlTemplate比現在所知的全部。它不能引用原始ControlTemplate中的Style模板,因爲它不是可用的資源。 Style和ControlTemplate是不同的野獸。

您有兩種選擇。要麼你採取獨特的切換按鈕樣式模板,並把它的地方可以達到的靜態資源和REF它的切換按鈕比如你ControlTemplate內通過正常<ToggleButton Style="{StaticResource ComboBoxUniqueToggleButtonStyleKeyNameYouGiveIt}" ..../> (一樣,如果它是在一個資源字典,除了那麼它的加載所有通常沒有必要的時間)。

或者,你可以直接將它嵌入到你的ControlTemplate就像他們做in the default style/controltemplate for ComboBox

您可以通過BasedOn繼承部分Style模板,但一次只能有一個ControlTemplate

希望這會有所幫助,我會收回我的重複投票。

+0

因此,常規的ComboBox的ControlTemplate包含ToggleButton的樣式,即使當您編輯副本時,它會將Style放在ControlTemplate外面?(我注意到,該樣式有一個ControlTemplate,並且內置了ToggleButton) –

+0

Ya我不能說VS如何提取模板部件的邏輯。樣式模板只是提供了爲其定義的ControlTemplate的(Setter)屬性屬性的設置方法。您可以通過繼承將這些屬性設置應用於各種ControlTemplate。所以你可以繼承ToggleButton的Style模板(和它的ControlTemplate一樣),幾乎和你的第二個例子一樣。只要它可以到達該ToggleButton的Style模板的副本,否則它只會進入默認的{x:Type ToggleButton}模板,並且可能不像您希望ComoboBox ToggleButon的行爲那樣運行 –

1

要重新使用默認WPF風格ComboBox,使用:

<Style TargetType="ComboBox"> 
<!-- Setters in need of change --> 
</ Style> 

如果你想從一個繼承Style你自己創建的,你可以使用:

<Style TargetType="ComboBox" BasedOn="{StaticResource YourExistentStyle}"> 
<!-- Setters that need to change --> 
</ Style> 
+0

這不適合我的情況。我已經添加了一個更詳細的例子。 –