使用样式触发器来设置嵌套对象的属性
我在大画布上写了一个小多边形。当鼠标移过画布时,我想突出显示一个多边形。代码是这样的:使用样式触发器来设置嵌套对象的属性
<UserControl ...>
<Canvas Name="canvas" Height="22" Width="22">
<Canvas.Resources>
<Style TargetType="Canvas">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="false">
<Setter Property="polygon.Stroke" Value="#EEEEEE"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="polygon.Stroke" Value="Aqua"/>
</Trigger>
</Style.Triggers>
</Style>
</Canvas.Resources>
<Polygon Points="11,1 16,6 16,16 11,21" Name="polygon">
<Polygon.Fill>
<SolidColorBrush Color="#EEEEEE"/>
</Polygon.Fill>
</Polygon>
</Canvas>
</UserControl>
但是setter没有看到“多边形”。
不能使用Setters
这样的,如果你使用这种符号的引擎将寻找一个附加属性,如果没有Style.TargetType
被定为在点之前的类型的属性。
最容易做的事情可能是将样式应用到多边形本身,并使用绑定到Canvas
的DataTrigger
,以便触发其属性。
<Polygon Points="11,1 16,6 16,16 11,21" Name="polygon">
<Polygon.Fill>
<SolidColorBrush Color="#EEEEEE"/>
</Polygon.Fill>
<Polygon.Style>
<Style TargetType="{x:Type Polygon}">
<Style.Triggers>
<DataTrigger
Binding="{Binding Path=IsMouseOver,
RelativeSource={RelativeSource
AncestorType={x:Type Canvas}}}"
Value="True">
<Setter Property="Stroke" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
<Polygon.Style>
</Polygon>
它正在寻找名为“多边形”的Canvas属性,该属性又有一个名为“Stroke”的属性。如果您希望setter将目标设定为不同的对象,则需要使用TargetName。
<Setter TargetName="polygon" Property="Stroke" Value="#EEEEEE" />
我试过了。但“不能在样式设置器上设置TargetName属性。” – Badiboy
鸡蛋在脸上。我总是忘记那个小小的限制。 –
尝试EventTrigger
,因为其他类型的触发器只能在模板或样式中使用。而且我们已经知道Style.Trigger不允许你的场景。所以这里是你的工作范例:
<Canvas Name="canvas" Height="22" Width="22">
<Polygon Points="11,1 16,6 16,16 11,21" Name="polygon">
<Polygon.Fill>
<SolidColorBrush x:Name="brush" Color="#EEEEEE"/>
</Polygon.Fill>
<Polygon.Triggers>
<EventTrigger RoutedEvent="UIElement.MouseEnter">
<BeginStoryboard>
<Storyboard Storyboard.TargetName="brush" Storyboard.TargetProperty="Color">
<ColorAnimation From="#EEEEEE" To="Aqua" Duration="00:00:00.01" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="UIElement.MouseLeave">
<BeginStoryboard>
<Storyboard Storyboard.TargetName="brush" Storyboard.TargetProperty="Color">
<ColorAnimation From="Aqua" To="#EEEEEE" Duration="00:00:00.01" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Polygon.Triggers>
</Polygon>
</Canvas>
你可以用普通的触发器('Trigger.EnterActions'和'Trigger.ExitActions')做同样的事情,重点是这是一个动作不同的动画。此外,您的示例不再在画布上触发,而是在多边形本身上触发。 –
对于EnterActions/ExitActions,您需要一个属性IsMouseOver,它是IInputInterface的一部分。但Canvas和Polygon都没有实现。 –
画布是透明的,因此路由事件MouseEnter/MouseLeave不会触发。你需要为它指定一些背景,至少几乎是透明的。 –
它的工作原理,但只有当鼠标悬停在多边形上时,才会在画布的其余部分。 :( – Badiboy
@Badiboy:那么,正如在另一个答案指出,你需要在画布上设置背景,否则没有命中测试。 –
@AngelWPF:如果我不添加代码是故意的大部分时间,它可能导致人们复制粘贴而不是理解概念,例如你的代码在绑定中使用'RelativeSource',而有其他方式,所以即使代码没有被复制,某种方法也正在被强化, –