Why IsMouseOver is recognized and MouseDown isn't (Wpf Style trigger)?

后端 未结 3 2079
一整个雨季
一整个雨季 2020-12-16 16:34

Why IsMouseOver is recognized as a WPF style trigger and MouseDown isn\'t -given that both are valid UIElement properties as seen here-. First trigger works well but second

相关标签:
3条回答
  • 2020-12-16 17:17

    You could use PreviewMouseLeftButtonDown when using Control.Triggers, replacing control with the control item the template is being used in:

    <Grid>
      <Grid.Triggers>
        <EventTrigger RoutedEvent="Grid.PreviewMouseLeftButtonDown">
          <BeginStoryboard>
            <Storyboard>
              ...
            </Storyboard>
          </BeginStoryboard>
        </EventTrigger>
      </Grid.Triggers>
    </Grid>
    
    0 讨论(0)
  • 2020-12-16 17:22

    You can use MouseDown Event in Style.Triggers but you have to use an EventTrigger for that.

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

    And remember that

    the action will not be undone once the condition that raised the event is no longer true.

    0 讨论(0)
  • 2020-12-16 17:35

    Well, I guess you are mistaking MouseDown event for property. There is no IsMouseDown property but there exist similar IsPressed property but only for classes inheriting ButtonBase. You should just use event in code-behind or write an attached property if you want to keep your code-behind clean.

    This is how you do it. Create class:

    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 = sender as UIElement;
                if (element != null)
                {
                    SetIsMouseDown(element, true);
                }
            }
    
            private static void element_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
            {
                var element = sender as UIElement;
                if (element != null)
                {
                    SetIsMouseLeftButtonDown(element, true);
                }
            }
    
            private static void element_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
            {
                var element = sender 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 = sender 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);
            }
        }
    }
    

    Then in your style:

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

    And of course add namespace in your XAML file (look at the top):

    xmlns:local="clr-namespace:Mrpyo"
    
    0 讨论(0)
提交回复
热议问题