如何覆盖UserControl的ControlTemplate
当我尝试覆盖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>
?
的TabControl
类有一个[TemplatePart]
属性,它指示模板的必备部分:
[StyleTypedPropertyAttribute(Property = "ItemContainerStyle", StyleTargetType = typeof(TabItem))]
[TemplatePartAttribute(Name = "PART_SelectedContentHost", Type = typeof(ContentPresenter))]
public class TabControl : Selector
在这种情况下,模板必须包含一个名为ContentPresenter
PART_SelectedContentHost
。其他一切都是可选的,你可以在模板中放置任何你喜欢的东西(只要它有意义)。
关于这个问题的好的电话编辑;模板部件不一定是强制性的,例如ProgressBar的辉光部分可以省略。 MSDN:“这些部分通常是**必需的”http://msdn.microsoft.com/zh-cn/library/system.windows.templatepartattribute.aspx – 2011-04-17 02:52:32
当您重写任何控件的ControlTemplate时,您正在定义它的外观。 <StackPanel>
只是您使用的布局控件,它可能是网格或任何其他布局控件。
然而,这是它需要在那里。如果你看一下WPF控件层次结构,您可以在基础层面看几种类型的控制,控制,FrameworkElement的,等以后:
<ContentControl>
<HeaderedContentControl>
<ItemsControl>
<HeaderedItemsControl>
其中每一个都有特定的渲染选项和部件。在您的情况下,<TabControl>
是<Selector>
,这是<ItemsControl>
的特殊类型。这个选择器有一个内容和一个TabPanel,因此<TabPanel>
和<ContentPresenter>
(它告诉WPF在哪里呈现内容)。
将收购这方面的知识,最好的方法是通过查看默认WPF模板为每个控件,例如用于WPF4的TabControl的默认模板是here
只是为了澄清您的术语,你是不是在谈论一个“用户控件“ 这里。 UserControls不是模板化的。您是我相信询问“自定义模板控制”。 – AnthonyWJones 2011-04-17 12:48:32