2011-04-17 32 views
1

當我嘗試覆蓋usercontrol時,如何知道usercontrol的默認模板元素? 例如有人已經像這樣覆蓋了TabControl的模板。如何覆蓋UserControl的ControlTemplate

<TabControl> 
    <TabControl.Template> 
     <ControlTemplate TargetType="TabControl"> 
      <StackPanel> 
       <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Disabled"> 
        <TabPanel x:Name="HeaderPanel" 
          Panel.ZIndex ="1" 
          KeyboardNavigation.TabIndex="1" 
          Grid.Column="0" 
          Grid.Row="0" 
          Margin="2,2,2,0" 
          IsItemsHost="true"/> 
       </ScrollViewer> 
       <ContentPresenter x:Name="PART_SelectedContentHost" 
             SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
             Margin="{TemplateBinding Padding}" 
             ContentSource="SelectedContent"/> 
      </StackPanel> 
     </ControlTemplate> 
    </TabControl.Template> 
    <TabItem Header="TabItem1">TabItem1 Content</TabItem> 
    <TabItem Header="TabItem2">TabItem2 Content</TabItem> 
</TabControl> 

他怎麼知道有在的TabControl的模板<StackPanel><ContentPresenter>

+0

只是爲了澄清您的術語,你是不是在談論一個「用戶控件「 這裏。 UserControls不是模板化的。您是我相信詢問「自定義模板控制」。 – AnthonyWJones 2011-04-17 12:48:32

回答

2

TabControl類有一個[TemplatePart]屬性,它指示模板的必備部分:

[StyleTypedPropertyAttribute(Property = "ItemContainerStyle", StyleTargetType = typeof(TabItem))] 
[TemplatePartAttribute(Name = "PART_SelectedContentHost", Type = typeof(ContentPresenter))] 
public class TabControl : Selector 

在這種情況下,模板必須包含一個名爲ContentPresenterPART_SelectedContentHost。其他一切都是可選的,你可以在模板中放置任何你喜歡的東西(只要它有意義)。

+0

關於這個問題的好的電話編輯;模板部件不一定是強制性的,例如ProgressBar的輝光部分可以省略。 MSDN:「這些部分通常是**必需的」http://msdn.microsoft.com/zh-cn/library/system.windows.templatepartattribute.aspx – 2011-04-17 02:52:32

2

當您重寫任何控件的ControlTemplate時,您正在定義它的外觀。 <StackPanel>只是您使用的佈局控件,它可能是網格或任何其他佈局控件。

然而,這是它需要在那裏。如果你看一下WPF控件層次結構,您可以在基礎層面看幾種類型的控制,控制,FrameworkElement的,等以後:

  • <ContentControl>
  • <HeaderedContentControl>
  • <ItemsControl>
  • <HeaderedItemsControl>

其中每一個都有特定的渲染選項和部件。在您的情況下,<TabControl><Selector>,這是<ItemsControl>的特殊類型。這個選擇器有一個內容和一個TabPanel,因此<TabPanel><ContentPresenter>(它告訴WPF在哪裏呈現內容)。

將收購這方面的知識,最好的方法是通過查看默認WPF模板爲每個控件,例如用於WPF4的TabControl的默認模板是here