如何覆盖UserControl的ControlTemplate

时间:2011-04-17 01:15:28

标签: wpf silverlight controltemplate

当我试图覆盖它时,如何知道usercontrol的默认模板元素? 例如,有人像这样覆盖了TabControl的模板。

<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>

3 个答案:

答案 0 :(得分:2)

TabControl类有[TemplatePart]属性,表示模板的强制部分:

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

在这种情况下,模板必须包含名为ContentPresenter的{​​{1}}。其他一切都是可选的,你可以把任何你喜欢的东西放在模板中(只要它当然有道理)。

答案 1 :(得分:2)

当您为任何控件重写ControlTemplate时,您将定义它的外观。 <StackPanel>只是您正在使用的布局控件,它可以是网格或任何其他布局控件。

然而,它需要在那里。如果查看WPF控件层次结构,可以在Control,FrameworkElement等之后在基础级别看到几种类型的控件:

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

其中每一个都有特定的渲染选项和部分。在您的情况下,<TabControl><Selector>,是<ItemsControl>的特殊类型。此选择器具有内容和TabPanel,因此<TabPanel><ContentPresenter>(告诉WPF在何处呈现内容)。

获取此知识的最佳方法是查看每个控件的默认WPF模板,例如WPF4的TabControl默认模板为here

答案 2 :(得分:0)

See MSDN用于默认模板和样式。