我可以检查事件触发器内的条件吗?我怎么能只使用XAML做这样的事情?
<EventTrigger RoutedEvent="MouseDown">
<Trigger Property="IsPressed" Value="true">
<Setter Property = "Foreground" Value="Green"/>
答案 0 :(得分:0)
按钮和菜单项具有适用于您的IsPressed属性,但其他控件可以。但是,使用某些附加行为添加IsPressed属性很容易。这将让你像这样编写XAML:
<TextBlock Text="Hello" TriggerTest:IsPressedBehavior.MonitorMouse="true">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="Red" />
<Style.Triggers>
<Trigger Property="TriggerTest:IsPressedBehavior.IsPressed" Value="True">
<Setter Property="Foreground" Value="Green" />
</Trigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
附加行为类:
using System;
using System.Windows;
using System.Windows.Input;
namespace TriggerTest
{
public static class IsPressedBehavior
{
public static bool GetMonitorMouse(DependencyObject obj)
{
return (bool)obj.GetValue(MonitorMouseProperty);
}
public static void SetMonitorMouse(DependencyObject obj, bool value)
{
obj.SetValue(IsPressedProperty, value);
}
public static readonly DependencyProperty MonitorMouseProperty =
DependencyProperty.RegisterAttached("MonitorMouse",
typeof(bool),
typeof(IsPressedBehavior),
new UIPropertyMetadata(false, OnMonitorMouse));
public static bool GetIsPressed(DependencyObject obj)
{
return (bool)obj.GetValue(IsPressedProperty);
}
public static void SetIsPressed(DependencyObject obj, bool value)
{
obj.SetValue(IsPressedProperty, value);
}
public static readonly DependencyProperty IsPressedProperty =
DependencyProperty.RegisterAttached("IsPressed",
typeof(bool),
typeof(IsPressedBehavior),
new UIPropertyMetadata(false));
private static void OnMonitorMouse(DependencyObject depObj, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
UIElement uiElement = depObj as UIElement;
if (uiElement == null)
{
return;
}
if ((bool)dependencyPropertyChangedEventArgs.NewValue)
{
uiElement.MouseDown += OnMouseDown;
uiElement.MouseUp += OnMouseUp;
uiElement.MouseLeave += OnMouseLeave;
uiElement.MouseEnter += OnMouseEnter;
}
else
{
uiElement.MouseDown -= OnMouseDown;
uiElement.MouseUp -= OnMouseUp;
uiElement.MouseLeave -= OnMouseLeave;
uiElement.MouseEnter -= OnMouseEnter;
}
}
private static void OnMouseDown(object sender, MouseButtonEventArgs e)
{
SetIsPressed(sender as DependencyObject, true);
}
private static void OnMouseUp(object sender, MouseButtonEventArgs e)
{
SetIsPressed(sender as DependencyObject, false);
}
private static void OnMouseLeave(object sender, MouseEventArgs e)
{
SetIsPressed(sender as DependencyObject, false);
}
static void OnMouseEnter(object sender, MouseEventArgs e)
{
SetIsPressed(sender as DependencyObject, e.LeftButton == MouseButtonState.Pressed || e.MiddleButton == MouseButtonState.Pressed || e.RightButton == MouseButtonState.Pressed);
}
}
}