2012-05-19 21 views
10

爲什麼IsMouseOver被識別爲WPF樣式觸發器,並且MouseDown不是-given,它們都是有效的UIElement屬性,如seen here - 。第一個觸發器工作正常,但第二個觸發器甚至不能編譯爲什麼IsMouseOver被識別並且MouseDown不是(Wpf樣式觸發器)?

<Style.Triggers> 
    <Trigger Property="IsMouseOver" Value="true"> 
     <Setter Property="OpacityMask"> 
      <Setter.Value> 
       <LinearGradientBrush > 
        <GradientStop Color="Transparent" Offset="0"/> 
        <GradientStop Color="Black" Offset="0.5"/> 
        <GradientStop Color="Transparent" Offset="1"/> 
       </LinearGradientBrush> 
      </Setter.Value> 
     </Setter> 
    </Trigger> 
    <Trigger Property="MouseDown" Value="true"> 
     <Setter Property="OpacityMask"> 
      <Setter.Value> 
       <LinearGradientBrush> 
        <GradientStop Color="Black" Offset="0" /> 
        <GradientStop Color="White" Offset="1" /> 
       </LinearGradientBrush> 
      </Setter.Value> 
     </Setter> 
    </Trigger> 
</Style.Triggers> 
+1

不知道,但'MouseDown'不列爲財產在你提供的鏈接。 'OnMouseDown()'被列爲響應事件調用的方法,但不是屬性。 –

回答

15

嗯,我想你錯了MouseDown事件的財產。沒有IsMouseDown屬性,但存在類似的IsPressed屬性,但僅適用於繼承ButtonBase的類。如果你想保持你的代碼清潔,你應該只使用代碼隱藏事件或寫一個附加屬性。

這是你如何做到的。創建類:

using System; 
using System.Windows; 

namespace Mrpyo 
{ 
    public static class MouseDownHelper 
    { 
     public static readonly DependencyProperty IsEnabledProperty = DependencyProperty.RegisterAttached("IsEnabled", 
     typeof(bool), typeof(MouseDownHelper), new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnNotifyPropertyChanged))); 

     public static void SetIsEnabled(UIElement element, bool value) 
     { 
      element.SetValue(IsEnabledProperty, value); 
     } 

     public static bool GetIsEnabled(UIElement element) 
     { 
      return (bool)element.GetValue(IsEnabledProperty); 
     } 

     private static void OnNotifyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      var element = d as UIElement; 
      if (element != null && e.NewValue != null) 
      { 
       if ((bool)e.NewValue) 
       { 
        Register(element); 
       } 
       else 
       { 
        UnRegister(element); 
       } 
      } 
     } 

     private static void Register(UIElement element) 
     { 
      element.PreviewMouseDown += element_MouseDown; 
      element.PreviewMouseLeftButtonDown += element_MouseLeftButtonDown; 
      element.MouseLeave += element_MouseLeave; 
      element.PreviewMouseUp += element_MouseUp; 
     } 

     private static void UnRegister(UIElement element) 
     { 
      element.PreviewMouseDown -= element_MouseDown; 
      element.PreviewMouseLeftButtonDown -= element_MouseLeftButtonDown; 
      element.MouseLeave -= element_MouseLeave; 
      element.PreviewMouseUp -= element_MouseUp; 
     } 

     private static void element_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      var element = e.Source as UIElement; 
      if (element != null) 
      { 
       SetIsMouseDown(element, true); 
      } 
     } 

     private static void element_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      var element = e.Source as UIElement; 
      if (element != null) 
      { 
       SetIsMouseLeftButtonDown(element, true); 
      } 
     } 

     private static void element_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e) 
     { 
      var element = e.Source as UIElement; 
      if (element != null) 
      { 
       SetIsMouseDown(element, false); 
       SetIsMouseLeftButtonDown(element, false); 
      } 
     } 

     private static void element_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      var element = e.Source as UIElement; 
      if (element != null) 
      { 
       SetIsMouseDown(element, false); 
       SetIsMouseLeftButtonDown(element, false); 
      } 
     } 

     internal static readonly DependencyPropertyKey IsMouseDownPropertyKey = DependencyProperty.RegisterAttachedReadOnly("IsMouseDown", 
     typeof(bool), typeof(MouseDownHelper), new FrameworkPropertyMetadata(false)); 
     public static readonly DependencyProperty IsMouseDownProperty = IsMouseDownPropertyKey.DependencyProperty; 

     internal static void SetIsMouseDown(UIElement element, bool value) 
     { 
      element.SetValue(IsMouseDownPropertyKey, value); 
     } 

     public static bool GetIsMouseDown(UIElement element) 
     { 
      return (bool)element.GetValue(IsMouseDownProperty); 
     } 

     internal static readonly DependencyPropertyKey IsMouseLeftButtonDownPropertyKey = DependencyProperty.RegisterAttachedReadOnly("IsMouseLeftButtonDown", 
     typeof(bool), typeof(MouseDownHelper), new FrameworkPropertyMetadata(false)); 
     public static readonly DependencyProperty IsMouseLeftButtonDownProperty = IsMouseLeftButtonDownPropertyKey.DependencyProperty; 

     internal static void SetIsMouseLeftButtonDown(UIElement element, bool value) 
     { 
      element.SetValue(IsMouseLeftButtonDownPropertyKey, value); 
     } 

     public static bool GetIsMouseLeftButtonDown(UIElement element) 
     { 
      return (bool)element.GetValue(IsMouseLeftButtonDownProperty); 
     } 
    } 
} 

然後在你的風格:

<Setter Property="local:MouseDownHelper.IsEnabled" Value="True"/> 
<Style.Triggers> 
    <Trigger Property="local:MouseDownHelper.IsMouseLeftButtonDown" Value="True"> 
     <!-- ... --> 
    </Trigger> 
</Style.Triggers> 

當然在你的XAML文件中添加命名空間和(頂一下):

xmlns:local="clr-namespace:Mrpyo" 
+0

你能否提供一個你正在與「寫一個附屬物」談話的例子? –

+0

我正在爲你寫一堂課;)。但是你得等一下...... – mrpyo

+0

非常感謝這門課。我不得不使用PreviewMouseDown和PreviewMouseUp事件來實現它,但之後它非常棒。 –

2

您可以使用MouseDown EventStyle.Triggers但您必須使用EventTrigger

<EventTrigger RoutedEvent="MouseEnter"> 
    <BeginStoryboard> 
     <Storyboard> 
      ... 
     </Storyboard> 
    </BeginStoryboard> 
</EventTrigger> 

記住,

一次引發事件 條件不再爲真操作將無法撤銷。

0

使用Control.Triggers時,與模板中所使用的控制項更換控制你可以使用的PreviewMouseLeftButtonDown:

<Grid> 
    <Grid.Triggers> 
    <EventTrigger RoutedEvent="Grid.PreviewMouseLeftButtonDown"> 
     <BeginStoryboard> 
     <Storyboard> 
      ... 
     </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
    </Grid.Triggers> 
</Grid> 
相關問題