2010-07-28 2 views
9

이벤트 트리거 내에서 조건을 확인할 수 있습니까? XAML 만 사용하면 어떻게 할 수 있습니까?EventTrigger의 조건

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

답변

0

단추 및 메뉴 항목에는 다른 컨트롤이 있지만 작동하는 IsPressed 속성이 있습니다. 그러나 첨부 된 동작을 사용하여 IsPressed 속성을 쉽게 추가 할 수 있습니다.

<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); 
     } 
    } 
} 
이이 같은 XAML을 작성하게됩니다