2010-07-28 10 views
9

Posso controllare le condizioni all'interno di un evento trigger? come posso fare qualcosa del genere usando solo XAML?Condizione in un eventoTrigger

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

risposta

0

I pulsanti e le voci di menu hanno una proprietà IsPressed che potrebbe funzionare per voi, ma altri controlli. È comunque facile aggiungere una proprietà IsPressed usando un comportamento collegato. Questo vi permetterà di scrivere XAML in questo modo:

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

classe comportamento Allegati:

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