请考虑以下代码:
<Window>
<Window.Tag>
<Button x:Name="myButton"/>
</Window.Tag>
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="VisualState">
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="canvas">
<EasingColorKeyFrame KeyTime="0" Value="Red"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Canvas x:Name="canvas" Background="White">
<i:Interaction.Triggers>
<ei:DataTrigger Value="True">
<ei:DataTrigger.Binding>
<Binding Path="Equals">
<Binding.Source>
<local:DependencyObjectComparer X="{x:Reference myButton}" Y="{x:Reference myButton}"/>
</Binding.Source>
</Binding>
</ei:DataTrigger.Binding>
<ei:GoToStateAction StateName="VisualState"/>
</ei:DataTrigger>
<i:EventTrigger EventName="MouseLeftButtonDown">
<ei:GoToStateAction StateName="VisualState"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Canvas>
</Grid>
</Window>
DependencyObjectComparer做 - suprinsingly - 比较“X”和“Y”是否相等:
public class EqualityComparer<T> : IEqualityComparer<T>
{
public EqualityComparer(Func<T, T, bool> comparer)
{
Contract.Requires(comparer != null);
this.m_comparer = comparer;
}
public bool Equals(T x, T y)
{
return this.m_comparer(x, y);
}
public int GetHashCode(T obj)
{
return obj.ToString().ToLower().GetHashCode();
}
private readonly Func<T, T, bool> m_comparer;
}
public class LazyEqualityComparer<T> : DependencyObject
{
static LazyEqualityComparer()
{
EqualsProperty = DependencyProperty.Register
(
"Equals",
typeof(bool),
typeof(LazyEqualityComparer<T>),
null
);
}
public static readonly DependencyProperty EqualsProperty;
public Func<T, T, bool> Comparer { get; set; }
public T X
{
get { return this.m_x; }
set
{
if (!object.Equals(this.m_x, value))
{
this.m_x = value;
this.OnComperandChanged();
}
}
}
public T Y
{
get { return this.m_y; }
set
{
if (!object.Equals(this.m_y, value))
{
this.m_y = value;
this.OnComperandChanged();
}
}
}
[Bindable(true)]
new public bool Equals
{
get { return (bool)this.GetValue(EqualsProperty); }
private set { this.SetValue(EqualsProperty, value); }
}
private void OnComperandChanged()
{
this.Equals = new EqualityComparer<T>(
this.Comparer != null ? this.Comparer : (x, y) => x.Equals(y)
).Equals(this.X, this.Y);
}
private T m_x;
private T m_y;
}
public class DependencyObjectComparer : LazyEqualityComparer<DependencyObject> { }
当我点击Canvas时,EventTrigger正在触发,而DataTrigger则没有,而它确实返回了预期的值(true)。这种动作与这种触发器之间是否存在任何不兼容性?
我不知道我在这里做错了什么。感谢您的帮助。
答案 0 :(得分:1)
最后我自己找到了一个解决方案:
<Window>
<Window.Tag>
<Button x:Name="myButton"/>
</Window.Tag>
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="Default"/>
<VisualState x:Name="VisualState">
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="canvas">
<EasingColorKeyFrame KeyTime="0" Value="Red"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Canvas x:Name="canvas" Background="White">
<i:Interaction.Triggers>
<ei:PropertyChangedTrigger Binding="{Binding Tag, ElementName=window}">
<i:Interaction.Behaviors>
<ei:ConditionBehavior>
<ei:ConditionalExpression>
<ei:ComparisonCondition LeftOperand="{Binding Tag, ElementName=window}" RightOperand="{x:Reference myButton}"/>
</ei:ConditionalExpression>
</ei:ConditionBehavior>
</i:Interaction.Behaviors>
<ei:GoToStateAction StateName="VisualState"/>
</ei:PropertyChangedTrigger>
<ei:PropertyChangedTrigger Binding="{Binding Tag, ElementName=window}">
<i:Interaction.Behaviors>
<ei:ConditionBehavior>
<ei:ConditionalExpression>
<ei:ComparisonCondition LeftOperand="{Binding Tag, ElementName=window}" RightOperand="{x:Reference myButton}" Operator="NotEqual"/>
</ei:ConditionalExpression>
</ei:ConditionBehavior>
</i:Interaction.Behaviors>
<ei:GoToStateAction StateName="Default"/>
</ei:PropertyChangedTrigger>
</i:Interaction.Triggers>
</Canvas>
</Grid>
</Window>
是否有人知道是否可以设置虚假状态而无需再次更改操作员的条件?就像DataStateBehavior可能的那样。