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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章