将ControlTemplate基于另一个ControlTemplate

Tim*_*ers 5 wpf xaml styles controltemplate

我知道必须有一个简单的答案,但我找不到它.

我有一个叫做按钮的样式HoverButton.

<Style x:Key="HoverButton" TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border>
                    <ContentPresenter/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="BorderBrush" Value="Black"/>
                        <Setter Property="Background" Value="WhiteSmoke"/>
                        <Setter Property="Foreground" Value="DarkRed"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="Background" Value="Transparent"/>
</Style>
Run Code Online (Sandbox Code Playgroud)

然后,我想创建另一个基于HoverButton特定内容的"派生"样式.我在这里减少了上述风格的复杂性,但它足够复杂,我不想复制和粘贴它.

<Style x:Key="CloseButton" BasedOn="{StaticResource HoverButton}" TargetType="{x:Type Button}">
    <Setter Property="Content">
        <Setter.Value>
            <Path Width="8" Height="8" Stroke="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType=Button}}" Data="M0,0 L8,8 M8,0 L0,8" StrokeThickness="2" />
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

这不起作用 - "指定的元素已经是另一个元素的逻辑子元素.首先断开它." 看起来我需要重新定义Template派生样式的属性,但不知何故引用了基本样式的模板.

有任何想法吗?

H.B*_*.B. 4

您不能将模板建立在另一个基础上,但这一错误很容易解决。只需创建一个等效项ContentTemplate而不是设置Content. 这样,Path就会为每个按钮创建一个按钮,而不是为所有按钮创建一个按钮(这是不允许的)。

  • @TimRogers:我没有充分解释吗?顾名思义,模板是要创建的内容的构建计划,它们不是离散的对象,并且所有 UI 元素只能是一个父元素的子元素。使用模板,每个按钮都会创建自己的内容,但是如果您以某种样式设置内容,则只会创建一个在各处使用的对象。 (2认同)
  • 你解释得很好。我不太明白控制模板和内容模板之间的区别,但我想我现在明白了。`Template` 属性定义整个控件的模板,而 `ContentTemplate` 仅定义内部 `ContentPresenter` 使用的模板。简单的。 (2认同)