Silverlight MVVM 触发器

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Interactivity;

namespace MyPro.Triggers
{
    /// <summary>
    /// 鼠标滚轮触发器
    /// </summary>
    public class MouseWheelTrigger : EventTriggerBase<FrameworkElement>
    {
        private FrameworkElement _targetElement;

        protected override string GetEventName()
        {
            return "Loaded";
        }

        protected override void OnDetaching()
        {
            if (_targetElement != null)
            {
                _targetElement.MouseWheel -= new MouseWheelEventHandler(targetElement_MouseWheel);
            }
            base.OnDetaching();
        }

        protected override void OnEvent(EventArgs eventArgs)
        {
            _targetElement = this.AssociatedObject as FrameworkElement;
            if (_targetElement != null)
            {
                _targetElement.MouseWheel += new MouseWheelEventHandler(targetElement_MouseWheel);
            }
        }

        void targetElement_MouseWheel(object sender, MouseWheelEventArgs e)
        {
            InvokeActions(e.Delta);
        }
    }
}
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Interactivity;

namespace MyPro.Triggers
{
    /// <summary>
    /// 键盘按键触发器
    /// </summary>
    public class UwayKeyTrigger : EventTriggerBase<UIElement>
    {
        public static readonly DependencyProperty FiredOnProperty = DependencyProperty.Register("FiredOn", typeof(KeyTriggerFiredOn), typeof(UwayKeyTrigger), null);
        public static readonly DependencyProperty KeyProperty = DependencyProperty.Register("Key", typeof(Key), typeof(UwayKeyTrigger), null);
        public static readonly DependencyProperty ModifiersProperty = DependencyProperty.Register("Modifiers", typeof(ModifierKeys), typeof(UwayKeyTrigger), null);
        private UIElement targetElement;

        private static ModifierKeys GetActualModifiers(Key key, ModifierKeys modifiers)
        {
            if (key == Key.Ctrl)
            {
                modifiers |= ModifierKeys.Control;
                return modifiers;
            }
            if (key == Key.Alt)
            {
                modifiers |= ModifierKeys.Alt;
                return modifiers;
            }
            if (key == Key.Shift)
            {
                modifiers |= ModifierKeys.Shift;
            }
            return modifiers;
        }

        protected override string GetEventName()
        {
            return "Loaded";
        }

        private static UIElement GetRoot(DependencyObject current)
        {
            UIElement element = null;
            while (current != null)
            {
                element = current as UIElement;
                current = VisualTreeHelper.GetParent(current);
            }
            return element;
        }

        protected override void OnDetaching()
        {
            if (this.targetElement != null)
            {
                if (this.FiredOn == KeyTriggerFiredOn.KeyDown)
                {
                    this.targetElement.KeyDown -= new KeyEventHandler(this.OnKeyPress);
                }
                else
                {
                    this.targetElement.KeyUp -= new KeyEventHandler(this.OnKeyPress);
                }
            }
            base.OnDetaching();
        }

        protected override void OnEvent(EventArgs eventArgs)
        {
            this.targetElement = AssociatedObject as UIElement;
            if (targetElement == null)
            {
                return;
            }

            if (this.FiredOn == KeyTriggerFiredOn.KeyDown)
            {
                this.targetElement.KeyDown -= new KeyEventHandler(this.OnKeyPress);
                this.targetElement.KeyDown += new KeyEventHandler(this.OnKeyPress);
            }
            else
            {
                this.targetElement.KeyUp -= new KeyEventHandler(this.OnKeyPress);
                this.targetElement.KeyUp += new KeyEventHandler(this.OnKeyPress);
            }
        }

        private void OnKeyPress(object sender, KeyEventArgs e)
        {
            if ((e.Key == this.Key) && (Keyboard.Modifiers == GetActualModifiers(e.Key, this.Modifiers)))
            {
                base.InvokeActions(e);
            }
        }

        public KeyTriggerFiredOn FiredOn
        {
            get { return (KeyTriggerFiredOn)base.GetValue(FiredOnProperty); }
            set { base.SetValue(FiredOnProperty, value); }
        }

        public Key Key
        {
            get { return (Key)base.GetValue(KeyProperty); }
            set { base.SetValue(KeyProperty, value); }
        }

        public ModifierKeys Modifiers
        {
            get { return (ModifierKeys)base.GetValue(ModifiersProperty); }
            set { base.SetValue(ModifiersProperty, value); }
        }
    }

    /// <summary>
    /// 按键枚举
    /// </summary>
    public enum KeyTriggerFiredOn
    {
        KeyDown,
        KeyUp
    }
}
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Interactivity;

namespace MyPro.Triggers
{
    /// <summary>
    /// 双击触发器
    /// </summary>
    public class DoubleClickTrigger : EventTriggerBase<FrameworkElement>
    {
        private FrameworkElement _targetElement;

        /// <summary>
        /// 鼠标点击时的系统计时
        /// </summary>
        private int? _tickCount;

        private int _interval = 300;
        /// <summary>
        /// 双击的时间间隔
        /// </summary>
        public int Interval
        {
            get { return _interval; }
            set { _interval = value; }
        }

        /// <summary>
        /// 获取事件名称
        /// </summary>
        /// <returns></returns>
        protected override string GetEventName()
        {
            return "MouseLeftButtonUp";
        }

        protected override void OnEvent(EventArgs eventArgs)
        {
            int tick = Environment.TickCount;
            if (_tickCount.HasValue && ((tick - _tickCount) < _interval))
            {
                InvokeActions(eventArgs);
            }
            _tickCount = tick;
        }
    }
}

Xaml代码

xmlns:triggers="clr-namespace:MyPro.Triggers;assembly=MyPro.SL" 
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

  <i:Interaction.Triggers>
                                <triggers:DoubleClickTrigger>
                                    <i:InvokeCommandAction Command="{Binding MyCommand}" />
                                </triggers:DoubleClickTrigger>
                            </i:Interaction.Triggers>




发布了15 篇原创文章 · 获赞 6 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章