2010-07-28 20 views
9

Tôi có thể kiểm tra điều kiện bên trong trình kích hoạt sự kiện không? làm thế nào tôi có thể làm một cái gì đó như thế bằng cách sử dụng chỉ XAML?Điều kiện trong EventTrigger

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

Trả lời

0

Nút và mục menu có thuộc tính IsPress có thể hoạt động cho bạn nhưng các điều khiển khác. Tuy nhiên, thật dễ dàng để thêm một thuộc tính IsPressed bằng cách sử dụng một số hành vi được đính kèm. Điều này sẽ cho phép bạn viết XAML như thế này:

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

đính kèm lớp hành vi:

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); 
     } 
    } 
} 
Các vấn đề liên quan