Wpf 如何从另一个ControlTemplate使用ControlTemplate?

Wpf 如何从另一个ControlTemplate使用ControlTemplate?,wpf,xaml,Wpf,Xaml,我有 显然,这两个模板几乎相同。我能做些什么来消除重复的片段 将它们合并到单个控件模板中并传递依赖项或附加属性不是一个选项-我需要两个可区分的控件模板。与样式不同,您不能仅“覆盖”控件模板的一部分或将控件模板基于另一个控件模板。必须(重新)将整个模板定义为一个整体 您可以做的是将GroupBox和模板的所有公共部分移动到UserControl,并将此UserControl包含在两个模板中,例如: <!-- DERIVED1 - DERIVES FROM 'MOST BASE' --&g

我有


显然,这两个模板几乎相同。我能做些什么来消除重复的片段

将它们合并到单个
控件模板中
并传递依赖项或附加属性不是一个选项-我需要两个可区分的控件模板。

与样式不同,您不能仅“覆盖”控件模板的一部分或将控件模板基于另一个控件模板。必须(重新)将整个模板定义为一个整体

您可以做的是将GroupBox和模板的所有公共部分移动到UserControl,并将此UserControl包含在两个模板中,例如:

<!-- DERIVED1 - DERIVES FROM 'MOST BASE' -->
<ControlTemplate TargetType="ContentControl" x:Key="Derived1WidgetControlTemplate">
    <GroupBox Style="{StaticResource WidgetControlTemplateStyle}">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseLeftButtonDown">
                <i:InvokeCommandAction Command="{Binding ExpandCommand}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>

        <DockPanel>
            <!-- Some additional controls go here ... -->
            <Label Content="Blah blah" />

            <DockPanel>
                <!-- Content ... -->
                <ContentPresenter />
            </DockPanel>
        </DockPanel>
    </GroupBox>
</ControlTemplate>

<!-- MOST BASE -->
<ControlTemplate TargetType="ContentControl" x:Key="WidgetControlTemplate">
    <GroupBox Style="{StaticResource WidgetControlTemplateStyle}">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseLeftButtonDown">
                <i:InvokeCommandAction Command="{Binding ExpandCommand}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>

        <DockPanel>
            <!-- Content ... -->
            <ContentPresenter />
        </DockPanel>
    </GroupBox>
</ControlTemplate>

...
1.
2.

除此之外,恐怕没有办法避免必须在XAML标记中声明两次相同的元素。

这个交互触发器不容易重用,我知道的唯一方法是在这个示例中创建自己的控件GroupBox,并将其粘贴在其中。然后每次你使用这个新控件,它都会成为它的一部分。至于码头面板。您可以始终拥有两个带键的DockPanel,并在给定情况下使用所需的DockPanel。
<UserControl x:Class="WpfApplication2.GroupBoxUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfApplication2"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.Template>
        <ControlTemplate TargetType="UserControl">
            <GroupBox Style="{StaticResource WidgetControlTemplateStyle}">
                <ContentPresenter />
            </GroupBox>
        </ControlTemplate>
    </UserControl.Template>
</UserControl>

...

<ControlTemplate TargetType="ContentControl" x:Key="TemplateA">
    <local:GroupBoxUserControl>
        <TextBlock>1</TextBlock>
    </local:GroupBoxUserControl>
</ControlTemplate>
<ControlTemplate TargetType="ContentControl" x:Key="TemplateB">
    <local:GroupBoxUserControl>
        <TextBlock>2</TextBlock>
    </local:GroupBoxUserControl>
</ControlTemplate>