我有一个MainMenuButton
类型的自定义按钮UserControl
,而我正在设计它。
现在我想实现MultiTrigger
只在满足两个条件的情况下才改变按钮的外观。
第一个条件是IsMouseOver == true
。
我只是简单地提出以下Condition
:
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True"/>
</MultiTrigger.Conditions>
<MultiTrigger.EnterActions>
<Setter TargetName="LayoutRoot" Property="Background" Value="Red">
</MultiTrigger.EnterActions>
<MultiTrigger.ExitActions>
<Setter TargetName="LayoutRoot" Property="Background" Value="Black">
</MultiTrigger.ExitActions>
</MultiTrigger>
第二个条件与DependencyProperty
:
public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register("IsChecked", typeof(bool), typeof(MainMenuButton), new PropertyMetadata(false));
在另一个SO post用户说我可以使用DataTrigger
对IsCheckedProperty
作出反应。
所以我尝试了其他帖子中的代码,但它没有用:
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True"/>
<Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsChecked}" Value="False"/>
</MultiTrigger.Conditions>
<MultiTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource MouseEnter}"/>
</MultiTrigger.EnterActions>
<MultiTrigger.ExitActions>
<BeginStoryboard Storyboard="{StaticResource MouseLeave}"/>
</MultiTrigger.ExitActions>
</MultiTrigger>
如何解决这个问题? 谢谢你的回答! :)
答案 0 :(得分:10)
让它在同一时间工作。 我偶然发现了这篇包含有效解决方案的博客文章: http://anders.janmyr.com/search?q=multidatatrigger
将我的代码更改为以下内容:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True"/>
<Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsChecked}" Value="True"/>
</MultiDataTrigger.Conditions>
<Setter TargetName="LayoutRoot" Property="Background" Value="Red"/>
</MultiDataTrigger>
现在它有效。 无论如何,感谢所有回答者的努力!
答案 1 :(得分:1)
我猜你的风格没有指明正确的TargetType
。这应该有效 -
<Style TargetType="{x:Type local:MainMenuButton}">
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True"/>
<Condition Binding="IsChecked" Value="False"/>
</MultiTrigger.Conditions>
// Your setter goes here
</MultiTrigger>
</Style>
应该在xaml中添加名称空间local
,它对应于MainMenuButton类所在的命名空间。
答案 2 :(得分:1)
<Window x:Class="DataBinding.MultiTrigger"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MultiTrigger" Height="300" Width="300">
<Window.Resources>
<Style TargetType="Button">
<Style.Setters>
<Setter Property="Background" Value="BlueViolet"></Setter>
<Setter Property="Foreground" Value="Red"></Setter>
</Style.Setters>
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<!--Use only one conditions for Implementations-->
<Condition Property="Control.IsFocused" Value="True"></Condition>
<Condition Property="Control.IsMouseOver" Value="True"></Condition>
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter Property="Background" Value="Green"></Setter>
<Setter Property="Foreground" Value="White"></Setter>
</MultiTrigger.Setters>
</MultiTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Button Height="50">The World Game</Button>
答案 3 :(得分:0)
我认为您不需要绑定到您的DP,尝试使用Property =“IsChecked”作为IsMouseOver。