Как переопределить ControlTemplate для UserControl - PullRequest
1 голос
/ 17 апреля 2011

Как узнать элемент шаблона по умолчанию для 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 ]

2 голосов
/ 17 апреля 2011

Класс TabControl имеет атрибут [TemplatePart], который указывает обязательные части шаблона:

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

В этом случае шаблон должен содержать ContentPresenter с именем PART_SelectedContentHost. Все остальное необязательно, вы можете поместить в шаблон все, что вам нравится (конечно, если это имеет смысл).

2 голосов
/ 17 апреля 2011

Когда вы переопределяете ControlTemplate для любого элемента управления, вы определяете, как он будет выглядеть.<StackPanel> - это просто элемент управления макетом, который вы используете, это может быть сетка или любой другой элемент управления макетом.

Однако он должен быть там.Если вы посмотрите на иерархию элементов управления WPF, вы увидите несколько типов элементов управления на базовых уровнях после элемента управления, FrameworkElement и т. Д.:

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

Каждый из них имеет определенные параметры рендеринга и детали.В вашем случае <TabControl> - это <Selector>, который является особым типом <ItemsControl>.Этот селектор имеет Контент и TabPanel, то есть <TabPanel> и <ContentPresenter> (который сообщает WPF, где визуализировать Контент).

Лучший способ получить это знание - посмотреть на WPF по умолчанию.шаблоны для каждого элемента управления, например, шаблон TabControl по умолчанию для WPF4: здесь

0 голосов
/ 17 апреля 2011

См. MSDN для шаблонов и стилей по умолчанию.

...