在 MVVM 中处理按键和释放事件
Handling Key press & release events in MVVM
我正在使用 MVVM 模式开发一个 wpf 应用程序。我需要单独处理按键和释放事件,(例如在媒体播放器中 fwd/rev 发生直到用户按住按键并在他释放时停止)。
搜索了很多之后,我仍然找不到任何方法来做到这一点。谁能帮帮忙
我猜,您会将 Command
绑定到 Button
。如果您希望命令重复触发,可以使用 RepeatButton。它的设计目的是 purpose.You 可以将您的命令绑定到 Command
属性。它会反复触发您的方法,直到 RepeatButton
被释放。
感谢您的建议。
我找到了一种通过使用交互触发器和依赖项 属性 来做到这一点的方法。
以下是命令的依赖项 属性。
public class EventToCommand : TriggerAction<DependencyObject>
{
public ICommand Command
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
// Using a DependencyProperty as the backing store for Command. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CommandProperty =
DependencyProperty.Register("Command", typeof(ICommand), typeof(EventToCommand), new PropertyMetadata(null));
protected override void Invoke(object parameter)
{
if (Command != null
&& Command.CanExecute(parameter))
{
Command.Execute(parameter);
}
}
}
然后在 xaml 中使用它,如下所示:
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyUp">
<ap:EventToCommand Command="{Binding KeyReleaseCommand}"></ap:EventToCommand>
</i:EventTrigger>
<i:EventTrigger EventName="KeyDown">
<ap:EventToCommand Command="{Binding KeyDownCommand}"></ap:EventToCommand>
</i:EventTrigger>
</i:Interaction.Triggers>
在您的 ViewModel 中,KeyReleaseCommand 和 KeyDownCommand 是 RelayCommand。
public MainViewModel()
{
KeyDownCommand = new RelayCommand<KeyEventArgs>(OnKeyDown, null);
KeyReleaseCommand = new RelayCommand<KeyEventArgs>(OnKeyRelease, null);
}
private void OnKeyRelease(KeyEventArgs args)
{
if (args.KeyboardDevice.Modifiers == ModifierKeys.Alt)
{
if (args.SystemKey == Key.Left)
{
Trace.WriteLine("ALT+LEFT Released");
}
}
}
public void OnKeyDown(KeyEventArgs args)
{
if (args.IsRepeat)
return;
if (args.KeyboardDevice.Modifiers == ModifierKeys.Alt)
{
if(args.SystemKey == Key.Left)
{
Trace.WriteLine("ALT+LEFT");
}
}
}
我正在使用 MVVM 模式开发一个 wpf 应用程序。我需要单独处理按键和释放事件,(例如在媒体播放器中 fwd/rev 发生直到用户按住按键并在他释放时停止)。 搜索了很多之后,我仍然找不到任何方法来做到这一点。谁能帮帮忙
我猜,您会将 Command
绑定到 Button
。如果您希望命令重复触发,可以使用 RepeatButton。它的设计目的是 purpose.You 可以将您的命令绑定到 Command
属性。它会反复触发您的方法,直到 RepeatButton
被释放。
感谢您的建议。 我找到了一种通过使用交互触发器和依赖项 属性 来做到这一点的方法。 以下是命令的依赖项 属性。
public class EventToCommand : TriggerAction<DependencyObject>
{
public ICommand Command
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
// Using a DependencyProperty as the backing store for Command. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CommandProperty =
DependencyProperty.Register("Command", typeof(ICommand), typeof(EventToCommand), new PropertyMetadata(null));
protected override void Invoke(object parameter)
{
if (Command != null
&& Command.CanExecute(parameter))
{
Command.Execute(parameter);
}
}
}
然后在 xaml 中使用它,如下所示:
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyUp">
<ap:EventToCommand Command="{Binding KeyReleaseCommand}"></ap:EventToCommand>
</i:EventTrigger>
<i:EventTrigger EventName="KeyDown">
<ap:EventToCommand Command="{Binding KeyDownCommand}"></ap:EventToCommand>
</i:EventTrigger>
</i:Interaction.Triggers>
在您的 ViewModel 中,KeyReleaseCommand 和 KeyDownCommand 是 RelayCommand。
public MainViewModel()
{
KeyDownCommand = new RelayCommand<KeyEventArgs>(OnKeyDown, null);
KeyReleaseCommand = new RelayCommand<KeyEventArgs>(OnKeyRelease, null);
}
private void OnKeyRelease(KeyEventArgs args)
{
if (args.KeyboardDevice.Modifiers == ModifierKeys.Alt)
{
if (args.SystemKey == Key.Left)
{
Trace.WriteLine("ALT+LEFT Released");
}
}
}
public void OnKeyDown(KeyEventArgs args)
{
if (args.IsRepeat)
return;
if (args.KeyboardDevice.Modifiers == ModifierKeys.Alt)
{
if(args.SystemKey == Key.Left)
{
Trace.WriteLine("ALT+LEFT");
}
}
}