2012-05-19 3 views
10

Perché IsMouseOver è riconosciuto come trigger di stile WPF e MouseDown non ha il riconoscimento che entrambe sono proprietà UIElement valide come seen here -. Il primo trigger funziona bene ma il secondo non viene nemmeno compilato.Perché IsMouseOver è riconosciuto e MouseDown non lo è (trigger Stile 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

Non lo so, ma 'MouseDown' non è elencato come un proprietà a quel link che hai fornito. 'OnMouseDown()' è elencato come un metodo chiamato in risposta a un evento, ma non una proprietà. –

risposta

15

Bene, immagino che si stia scambiando l'evento MouseDown per proprietà. Non esiste la proprietà IsMouseDown ma esiste una proprietà simile IsPressed ma solo per le classi che ereditano ButtonBase. Dovresti semplicemente usare l'evento nel code-behind o scrivere una proprietà associata se vuoi mantenere pulito il codice.

Ecco come lo si fa. Creare classe:

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

Poi, nel tuo stile:

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

E naturalmente aggiungere spazio dei nomi nel file XAML (vedi in alto):

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

puoi fornire un esempio di cosa stai parlando con "scrivi una proprietà associata"? –

+0

Sto scrivendo un corso solo per te;). Ma devi aspettare un momento ... – mrpyo

+0

Grazie mille per questa lezione. Ho dovuto usare gli eventi PreviewMouseDown e PreviewMouseUp per farlo funzionare, ma dopo è stato fantastico. –

2

È possibile utilizzare MouseDown Event in Style.Triggers ma devi usare uno EventTrigger per quello.

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

E ricordate che

l'azione non sarà annullata una volta che la condizione che ha generato l'evento non è più vero.

0

Si potrebbe utilizzare PreviewMouseLeftButtonDown quando si utilizza Control.Triggers, sostituendo il controllo con la voce di controllo il modello è utilizzato in:

<Grid> 
    <Grid.Triggers> 
    <EventTrigger RoutedEvent="Grid.PreviewMouseLeftButtonDown"> 
     <BeginStoryboard> 
     <Storyboard> 
      ... 
     </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
    </Grid.Triggers> 
</Grid>