Условие в EventTrigger

Я могу проверить условие в триггере события? как я могу сделать что-то как это использование только XAML?

 <EventTrigger RoutedEvent="MouseDown">
    <Trigger Property="IsPressed" Value="true">
       <Setter Property = "Foreground" Value="Green"/>
9
задан iLemming 28 July 2010 в 14:19
поделиться

1 ответ

Кнопки и пункты меню имеют свойство IsPressed, которое будет работать для вас, но другие элементы управления работают. Однако легко добавить свойство IsPressed с помощью некоторого присоединенного поведения. Это позволит вам написать XAML следующим образом:

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

Присоединенный класс поведения:

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);
        }
    }
}
0
ответ дан 5 December 2019 в 04:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: