2010-07-28 12 views
9

¿Puedo verificar la condición dentro de un desencadenante de evento? ¿Cómo puedo hacer algo así usando solo XAML?Condición en un EventTrigger

<EventTrigger RoutedEvent="MouseDown"> 
    <Trigger Property="IsPressed" Value="true"> 
     <Setter Property = "Foreground" Value="Green"/> 

Respuesta

0

Los botones y elementos de menú tienen una propiedad IsPressed que funcionaría para usted pero otros controles sí. Sin embargo, es fácil agregar una propiedad IsPressed utilizando algún comportamiento adjunto. Esto le permitirá escribir XAML como esto:

<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> 

adjunta clase de comportamiento:

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); 
     } 
    } 
} 
Cuestiones relacionadas