2012-05-19 7 views
10

¿Por qué IsMouseOver se reconoce como un activador de estilo WPF y MouseDown no se da dado que ambas son propiedades de UIElement válidas como seen here? El primer disparador funciona bien pero el segundo ni siquiera compila.¿Por qué se reconoce IsMouseOver y MouseDown no es (Wpf Style trigger)?

<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

No sabe, pero 'MouseDown' no está catalogado como un propiedad en ese enlace que proporcionó. 'OnMouseDown()' aparece como un método llamado en respuesta a un evento, pero no a una propiedad. –

Respuesta

15

Bueno, supongo que usted está confundiendo MouseDown caso de la propiedad. No existe la propiedad IsMouseDown pero existe una propiedad similar IsPressed pero solo para las clases que heredan ButtonBase. Solo debe usar el evento en el código subyacente o escribir una propiedad adjunta si desea mantener limpio el código subyacente.

Así es como lo haces. Crear clase:

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

Luego, en su estilo:

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

Y, por supuesto, añadir espacio de nombres en su archivo XAML (busque en la parte superior):

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

¿Puedes dar un ejemplo de lo que estás diciendo con "escribir una propiedad adjunta"? –

+0

Estoy escribiendo una clase solo para ti;). Pero tienes que esperar un momento ... – mrpyo

+0

Muchas gracias por esta clase. Tuve que usar los eventos PreviewMouseDown y PreviewMouseUp para que funcionara, pero después de eso fue increíble. –

2

Puede utilizar MouseDown Event en Style.Triggers pero tienes que usar un EventTrigger para eso.

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

Y recuerda que

la acción no se puede deshacer una vez que la condición que provocó el evento ya no es cierto.

0

Se puede usar cuando se utiliza PreviewMouseLeftButtonDown Control.Triggers, en sustitución de control con el elemento de control de la plantilla se está utilizando en:

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