我通过这里提出的一些问题制作了一个三角形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>
答案 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>