WPF在绘制按钮上触发

时间:2014-04-24 11:16:08

标签: wpf templates triggers styles controltemplate

我通过这里提出的一些问题制作了一个三角形Button,一切正常,但现在我想添加Triggers但没有任何反应。我有两个Buttons应该在IsMouseOver上发生一些事情,但三角形指向不同的方向(<&>)。所以我想我用所有触发器创建一个Style,然后从这个样式继承两个样式并绘制三角形。但就像我说没有发生任何事情一样。

在前2个Anwers之后更新:

<Style x:Key="DateTrigger" TargetType="Button">
            <Setter Property="OverridesDefaultStyle" Value="True"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Background" Value="Black"/>                                   
                            </Trigger>
                            <Trigger Property="IsPressed" Value="True">
                                <Setter Property="Background" Value="Red"/>                                 
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style x:Key="Back" BasedOn="{StaticResource DateTrigger}" TargetType="Button">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Polygon Stroke="Black" Fill="{TemplateBinding Background}">
                        <Polygon.Points>
                            <Point X="74.2" Y="0"/>
                            <Point X="0" Y="25"/>
                            <Point X="74.2" Y="50"/>
                        </Polygon.Points>
                        </Polygon>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

2 个答案:

答案 0 :(得分:1)

您已将Trigger设置为影响Background属性,但尚未在ControlTemplate中定义该属性的使用。因此,Background属性值可能会发生变化,但由于您未在ControlTemplate中使用它,因此无法看到它。您可以使用TemplateBinding Markup Extension

Background访问ControlTemplate媒体资源
<Border Name="border"
        BorderThickness="1"
        Padding="4,2"
        BorderBrush="Black"
        CornerRadius="1"
        Background="{TemplateBinding Background}">
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>

更新&gt;&gt;&gt;

我不确定你为什么说Style仍然无效......它运作得很好。只需将Style(包括{TemplateBinding Background})应用到Button并将其鼠标悬停在其上:

<Button Style="{StaticResource DateTrigger}" Content="Click me" />

我刚刚注意到您已经更改/删除了原始代码示例...请不要这样做,因为这意味着答案,评论(有时是问题)不再有意义。所以无论如何,你的原始代码工作得很好(添加了{TemplateBinding Background}),所以如果我是你,我会替换它。这是我编辑的原始工作代码示例:

<Style x:Key="DateTrigger" TargetType="Button">
    <Setter Property="OverridesDefaultStyle" Value="True"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border Name="border"
                        BorderThickness="1"
                        Padding="4,2"
                        BorderBrush="Black"
                        CornerRadius="1"
                        Background="{TemplateBinding Background}">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="Button.IsMouseOver" Value="True">
                        <Setter Property="Background" Value="Black"/>
                        <Setter Property="Foreground" Value="White"/>
                    </Trigger>
                    <Trigger Property="Button.IsPressed" Value="True">
                        <Setter Property="Background" Value="Red"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<Style x:Key="Back" BasedOn="{StaticResource DateTrigger}" TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Polygon Stroke="Black" Fill="White">
                    <Polygon.Points>
                        <Point X="74.2" Y="0"/>
                        <Point X="0" Y="25"/>
                        <Point X="74.2" Y="50"/>
                    </Polygon.Points>
                </Polygon>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

更新2&gt;&gt;&gt;

嗯,你不能使用Back Style,因为其中的ControlTemplate将替换ControlTemplate中的DateTrigger Style以及Triggers部分。要解决此问题,您只需在Triggers

中添加更多Back Style ControlTemplate即可
<Style x:Key="Back" BasedOn="{StaticResource DateTrigger}" TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Polygon Stroke="Black" Fill="{TemplateBinding Background}">
                    <Polygon.Points>
                        <Point X="74.2" Y="0"/>
                        <Point X="0" Y="25"/>
                        <Point X="74.2" Y="50"/>
                    </Polygon.Points>
                </Polygon>
                <ControlTemplate.Triggers>
                    <Trigger Property="Button.IsMouseOver" Value="True">
                        <Setter Property="Background" Value="Black"/>
                        <Setter Property="Foreground" Value="White"/>
                    </Trigger>
                    <Trigger Property="Button.IsPressed" Value="True">
                        <Setter Property="Background" Value="Red"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

...

<Button Style="{StaticResource Back}" Content="Click me" />

答案 1 :(得分:1)

首先,您的Trigger设置Button.Background而非Border.Background,因此您需要将TargetName设置为Border的名称

<Setter TargetName="border" Property="Background" Value="Black"/>

或使用TemplateBinding并将Button.Background绑定到Border.Background

<Border Name="border" ... Background="{TemplateBinding Background}">

第二个问题是,在我看来,你认为ControlTemplate以某种方式合并。不是这种情况。当您以Template样式设置Back时,您会覆盖从DateTrigger样式继承的值,从而有效地丢失所有触发器。一种解决方案是将Content设置为Back样式而不是Template

<Style x:Key="Back" BasedOn="{StaticResource DateTrigger}" TargetType="Button">
   <Setter Property="Content">
      <Setter.Value>
         <Polygon Stroke="Black" Fill="White">
            <Polygon.Points>
               <Point X="74.2" Y="0"/>
               <Point X="0" Y="25"/>
               <Point X="74.2" Y="50"/>
            </Polygon.Points>
         </Polygon>
      </Setter.Value>
   </Setter>
</Style>