2011-05-26 44 views
46

您能告訴我樣式和控制模板之間的主要區別是什麼? 何時或爲什麼要使用其中一種?樣式和控制模板之間的區別

對我而言,他們正是相同。因爲我是初學者,我認爲我錯了,因此我的問題。

+1

相關:[ItemTemplate vs ControlTemplate](http://stackoverflow.com/questions/575389/itemtemplate-vs-controltemplate) – Helen 2012-03-12 13:36:55

+2

MSDN資源,樣式和模板之間的區別:http://msdn.microsoft.com/ en-us/library/cc295273%28v = expression.40%29.aspx – 2014-06-19 20:13:09

回答

23

沒有的確是你錯了。 樣式在控件上設置屬性ControlTemplate是大多數控件共享的屬性,這些控件指定了它們的呈現方式。

詳細說明,您可以使用樣式來爲一組屬性分組設置,以便您可以重複使用該樣式來標準化您的控件。樣式可以在控件上明確設置,也可以應用所有類型的樣式。

控件模板可以通過樣式設置,也可以通過在控件上顯式設置來改變它的顯示方式。所有的控件都有嵌入.net wpf程序集的默認模板(以及相關的樣式)。看到這些並理解wpf開發人員如何實現所有控件的正常版本是非常有啓發性的。如果安裝了Expression混合,請查看其「SystemThemes」文件夾。

UPDATE:

要了解如何樣式和CONTROLTEMPLATES可以在 「添加控件」。以某種方式,ControlTemplate是定義控件的唯一方法,控件由組成。但是,某些默認的.net控件允許您使用控件代替文本。

例如:

<GroupBox> 
    <GroupBox.Header> 
    <CheckBox/> 
    </GroupBox.Header> 
</GroupBox> 

這種「增加了」一個複選框組框不改變ControlTemplate,但這是因爲GroupBox默認ControlTemplate允許任何作爲標題。這是通過使用諸如ContentPresenter等特殊控件完成的。

但是,有時控件的默認ControlTemplate不允許您通過屬性更改要更改的內容。然後,您必須更改ControlTemplate。

無論您直接或通過樣式設置控件的屬性(內容,標題,ControlTemplate,IsEnabled等)都無關緊要,樣式只是一種方便。

希望這能更清楚地回答你的問題。

+1

好的,但在我工作的項目中,兩者都用於將其他控件添加到某些控件...並且還設置屬性...所以我沒有看到他們使用的區別? ? ? – 2011-05-26 09:19:42

53

在您設置控件屬性的樣式中。

<Style x:Key="MyButtonStyle" TargetType="Button"> 
    <Setter Property="Background" Value="Red"/> 
</Style> 

<Button Style="{StaticResource MyButtonStyle}"/> 

所有使用此風格的按鈕都將背景設置爲紅色。

在模板中,您可以定義控件的UI(結構)。

<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button"> 
    <Grid> 
     <Rectangle Fill="Green"/> 
     <ContentPresenter/> 
    </Grid> 
</ControlTemplate> 

<Button Template="{StaticResource MyButtonTemplate}"/> 

所有使用此模板的按鈕都將具有無法更改的綠色背景。

設置在模板中的值只能替換爲替換整個模板。 風格中的值可以通過在使用控件時明確設置值來替換。這就是爲什麼通過使用TemplateBinding而不是編碼值來更好地使用控件的屬性。

<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button"> 
    <Grid> 
     <Rectangle Fill="{TemplateBinding Background}"/> 
     <ContentPresenter/> 
    </Grid> 
</ControlTemplate> 

現在模板使用它應用到按鈕的背景屬性的值,因此它可定製:

<Button Template="{StaticResource MyButtonTemplate}" Background="Yellow"/> 

另一個有用的功能是控制可以拿起一個默認樣式而沒有分配給他們的特定風格。你不能用模板做到這一點。

只需刪除樣式的x:Key屬性(再次:您不能使用模板執行此操作)。樣式下的可視化樹中的所有按鈕都將應用此樣式。

結合模板和樣式是額外的強大:

<Style TargetType="Button"> 
    <Setter Property="Background" Value="Red"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <Grid> 
        <Rectangle Fill="{TemplateBinding Background"/> 
        <ContentPresenter/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+3

所以,你的例子恰好符合我想知道的問題...控制模板和只能清除一個控制模板的樣式之間有什麼區別?始終用Styles封裝controltemplate常見? – 2011-05-26 09:22:53

13

你能想到的一種風格,因爲一組屬性值適用於多於一個方便的方法:你可以在樣式設置模板屬性元件。您可以通過直接在每個TextBlock元素上設置屬性(如FontSize和FontFamily)來更改默認外觀。但是,如果您希望TextBlock元素共享某些屬性,則可以在XAML文件的參考資料部分創建一個樣式。

另一方面,ControlTemplate指定控件的視覺結構和視覺行爲。您可以通過給它一個新的ControlTemplate來自定義控件的外觀。當您創建ControlTemplate時,您將替換現有控件的外觀而不更改其功能。例如,您可以將應用程序中的按鈕替換爲默認的方形,但按鈕仍然會引發Click事件。

編號:http://msdn.microsoft.com/en-us/library/ms745683.aspx

0

OK,我有相同的問題,我在此線程中找到的答案,我指出了正確的方向,所以我分享,如果只有這樣我能更好地理解它自己。

樣式比ControlTemplate更靈活。

的Windows Presentation Foundation偷跑,亞當森和幫派(作家)的狀態是:

  • 「除了[使用樣式的控件模板制定者與風格]任意屬性模板相結合的方便設置,這樣做有[設置一個風格的ControlTemplate二傳手]重要的優點:

    1. 它給你的默認模板的效果。例如,當一個類型樣式被應用到埃爾默認情況下,並且該樣式包含自定義控件模板,則控件模板將在沒有任何明確標記的情況下應用於這些元素。
    2. 它使您能夠提供控制模板外觀的默認但可覆蓋的屬性值。換句話說,它使您能夠尊重模板父級的屬性,但仍然提供您自己的默認值。「

換句話說,營造出風格允許樣式的模板二傳手覆蓋值設置,即使他們沒有使用(例如{TemplateBinding寬度})一個TemplateBinding的用戶。如果你在樣式中對寬度進行了硬編碼,Style的用戶仍然可以覆蓋它,但是如果在模板中對該Width屬性進行了硬編碼,則用戶會被卡住。

此外,(這有點令人困惑)使用帶有TemplateBinding的ContentTemplate,用戶可以使用該屬性來設置該屬性,否則它將使用TargetType的默認屬性。如果使用樣式,則可以覆蓋默認屬性通過使用該屬性的setter,然後將TemplateBinding引用返回給該設置器,來創建TargetType。這本書更好的解釋了它,338頁(混合模板與樣式)

2

我發現了一些有趣的差異在 The difference between styles and templates (msdn)

風格: 您可以設置只有預先存在中的樣式屬性。例如,您不能爲屬於您添加到模板的新零件的屬性設置默認值。

模板: 當你修改模板,您可以訪問控制當你修改樣式比的更多部分。例如,您可以更改彈出列表在組合框中的顯示方式,或者通過修改項目模板來更改觸發組合框中彈出列表的按鈕的外觀。


風格: 可以使用樣式指定控件的默認行爲。例如,在按鈕樣式中,可以指定一個觸發器,以便當用戶將鼠標指針移動到按鈕上時,背景顏色將會改變。這些屬性更改是即時的(它們不能逐步動畫)。

模板: 您可以通過使用觸發器指定模板中任何新部件和現有部件的行爲。例如,您可以指定一個觸發器,以便當用戶將鼠標指針移到某個按鈕上時,其中一個部件的顏色將會改變。這些屬性更改可以是瞬時的,或者逐漸動畫以產生平滑過渡。

相關問題