2011-04-17 35 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