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>