WPF的中模板有三種:ControlTemplate、ItemsPanelTemplate、DataTemplate,他們繼承抽象類FrameworkTemplate,下麵是它們的繼承關係: Windows Presentation Foundation (WPF) 中的控制項具有 ControlTe... ...
WPF的中模板有三種:ControlTemplate、ItemsPanelTemplate、DataTemplate,他們繼承抽象類FrameworkTemplate,下麵是它們的繼承關係:
Windows Presentation Foundation (WPF) 中的控制項具有 ControlTemplate,它包含該控制項的可視化樹,當在模板中查找指定控制項時,會用到可視化樹。 可以通過修改某個控制項的 ControlTemplate 來更改該控制項的結構和外觀。 不能僅替換控制項的可視化樹的一部分;若要更改控制項的可視化樹,必須將該控制項的 Template 屬性設置為新的完整 ControlTemplate。
通常使用 ContentControl 的 ControlTemplate 中的 ContentPresenter 來指定要將內容添加到的位置。 每種 ContentControl 類型都在其預設 ControlTemplate 內有一個 ContentPresenter。
當 ContentPresenter 對象位於 ContentControl 的 ControlTemplate 中時, Content、 ContentTemplate 和 ContentTemplateSelector 屬性會從 ContentControl 的同名屬性獲取其值。 通過設置 ContentSource 屬性或綁定到模板化父級的其他屬性,可以使 ContentPresenter 屬性獲得這些屬性的值。通過下麵例子理解
<Style TargetType="HeaderedContentControl"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type HeaderedContentControl}"> <StackPanel> <Grid> <Rectangle Stroke="{TemplateBinding Background}"/> <ContentPresenter ContentSource="Header"/> </Grid> <Grid> <Rectangle Fill="{TemplateBinding Background}"/> <ContentPresenter ContentSource="Content"/> </Grid> </StackPanel> </ControlTemplate> </Setter.Value> </Setter> </Style>
HeaderedContentControl 應用了上面的樣式,在樣式中,通過設置ContentSource="Header",ContentPresenter 的Content屬性與HeaderedContentControl 控制項的Header的屬性顯示一致,如果樣式中去掉這一設置,則會獲取同名屬性的值,即HeaderedContentControl 的Content
<HeaderedContentControl Name="hcontCtrl" Background="Beige" Header="This is the header." Content="This is the content."/>
使用 DataTemplate 可以定義數據的可視表示形式。
ControlTemplate中使用ContentPresenter時,可以設置ContentPresenter的ContentTemplate屬性,該屬性是DataTemplate類型,可以控制內容的呈現方式。ControlTemplate中可能不止一個ContentPresenter,如GroupBox有兩個ContentPresenter,分別用於展示標題和內容。不必在ControlTemplate中修改ContentPresenter的DataTemplate,控制項直接將DataTemplate類型的屬性公開給用戶,用戶可以直接為該屬性設置一個新模板,如可以直接設置GroupBox的HeaderTemplate和ContentTemplate分別控制標題和內容面板中的數據展示方式。
DataTemplate類型的對象在不同的控制項叫法不一,在Button中稱為ContentTemplate,在ListBox中稱為ItemTemplate,而在GroupBox中稱為HeaderTemplate和ContentTemplate。其實,是通過控制項間接引用了相應ContentPresenter中的ControlTemplate。