当我试图覆盖它时,如何知道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>
?
答案 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用于默认模板和样式。