Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 将一个ControlTemplate基于另一个ControlTemplate_Wpf_Xaml_Styles_Controltemplate - Fatal编程技术网

Wpf 将一个ControlTemplate基于另一个ControlTemplate

Wpf 将一个ControlTemplate基于另一个ControlTemplate,wpf,xaml,styles,controltemplate,Wpf,Xaml,Styles,Controltemplate,我知道一定有一个简单的答案,但我找不到 我有一个按钮样式,叫做HoverButton <Style x:Key="HoverButton" TargetType="Button"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Border>

我知道一定有一个简单的答案,但我找不到

我有一个按钮样式,叫做
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>
这不起作用-“指定的元素已经是另一个元素的逻辑子元素。请先断开它的连接。”似乎我需要重新定义派生样式的
Template
属性,但以某种方式引用基础样式的模板


有什么想法吗?

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

我假设第二个样式中缺少的TargetType只是一个滑动(因此我添加了它)…就是这样。我知道这很简单。谢谢现在我要弄清楚它为什么有效;)@蒂姆罗杰斯:我没有充分解释吗?顾名思义,模板是要创建内容的构建计划,它们不是离散对象,所有UI元素只能是父元素的子元素。使用模板,每个按钮都会创建自己的内容,但是如果您将内容设置为一种样式,则只会创建一个对象,该对象在任何地方都会使用。您对此做了很好的解释。我不太明白控件模板和内容模板之间的区别,但我想我现在明白了。
Template
属性定义整个控件的模板,而
ContentTemplate
仅定义内部
ContentPresenter
使用的模板。简单。
<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>