Wpf 在特定键上使用EventTrigger
我希望在触摸特定键(例如空格键)时使用EventTrigger调用命令 目前我有:Wpf 在特定键上使用EventTrigger,wpf,keydown,interaction,eventtrigger,Wpf,Keydown,Interaction,Eventtrigger,我希望在触摸特定键(例如空格键)时使用EventTrigger调用命令 目前我有: <i:Interaction.Triggers> <i:EventTrigger EventName="KeyDown"> <i:InvokeCommandAction Command="{Binding DoCommand}" CommandParameter="{BindingText}"/> </i:Event
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyDown">
<i:InvokeCommandAction Command="{Binding DoCommand}" CommandParameter="{BindingText}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
现在,我如何指定只有当空格键按下时才会发生这种情况?您必须构建一个自定义触发器来处理:
public class SpaceKeyDownEventTrigger : EventTrigger {
public SpaceKeyDownEventTrigger() : base("KeyDown") {
}
protected override void OnEvent(EventArgs eventArgs) {
var e = eventArgs as KeyEventArgs;
if (e != null && e.Key == Key.Space)
this.InvokeActions(eventArgs);
}
}
另一种方法是使用KeyBindings并将它们绑定到窗口、UserControl、FrameworkElement等。这不会触发按钮,但如果您有一个从按钮调用的命令“MyCommand”,则可以从InputBindings调用该命令
<UserControl.InputBindings>
<KeyBinding Command="{Binding Path=ApplyCommand}" Key="Enter"/>
<KeyBinding Command="{Binding Path=NextPage}" Modifiers="Ctrl" Key="Left"/>
</UserControl.InputBindings>
<StackPanel>
<Button IsDefault="True" Content="Apply">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding Path=ApplyCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</StackPanel>
您还可以将这些键绑定绑定到文本框。我喜欢使用自定义触发器的想法,但我没有成功地使其工作(一些方法已更改或不推荐使用,因此上面显示的
SpaceKeyDownEventTrigger
的定义现在未编译)。因此,我将使用customRoutedEvent
的工作版本放在这里。SpaceKeyDownEvent
在MyControl
自定义控件中定义,当未处理的KeyDown
附加事件到达MyControl
且按下的键是空格键时,会从OnKeyDown
方法引发
公共类MyControl:ContentControl
{
//如果您需要,将自动提供此构造函数
//向项目中添加自定义控件(WPF)
静态MyControl()
{
DefaultStyleKeyProperty.OverrideMetadata(
类型(MyControl),
新的框架属性ymetadata(typeof(MyControl));
}
//通过首先注册RoutedEventID创建自定义路由事件
//此事件使用冒泡路由策略
公共静态只读RoutedEvent SpaceKeyDownEvent=EventManager.RegisterRoutedEvent(
“空格键关闭”,
路由策略,泡沫,
类型(RoutedEventHandler),
类型(MyControl);
//为事件提供CLR访问器
公共事件路由EventHandler SpaceKeyDown
{
添加{AddHandler(SpaceKeyDownEvent,value);}
remove{RemoveHandler(SpaceKeyDownEvent,value);}
}
//此方法引发SpaceKeyDown事件
受保护的虚拟void RaiseSpaceKeyDownEvent()
{
RoutedEventArgs=新的RoutedEventArgs(SpaceKeyDownEvent);
RaiseEvent(args);
}
//此处,KeyDown附加事件是为所需密钥定制的
受保护的覆盖无效OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
if(e.Key==Key.Space)
RaiseSpaceKeyDownEvent();
}
}
MyControl
可以添加到另一个控件的模板中,允许后者将EventTrigger
与SpaceKeyDown
路由事件一起使用:
谢谢您的回复,尽管我仍然无法让它工作。我将XAML更改为使用SpaceKeyDownEventTrigger
(而不仅仅是'EventTrigger),但未输入
OnEvent'。我的XAML还有什么需要更改的吗?谢谢again@lost_bits1110-您能否更新您的问题以包含完整的示例?您确定关联控件触发了KeyDown事件吗?是的,在我的原始帖子中,关联控件触发了该事件,但每个KeyDown事件都会发生。我只希望它发生在指定的密钥上。正如您所发布的,我添加了一个自定义EventTrigger类,并简单地将我的XAML更改为使用SpakeKeyDownEventTrigger替换EventTrigger,但看起来我需要更多的东西好了,现在它可以工作了-我的错误是我忘了放置“override”关键字。谢谢@lost_bits1110-啊,是的,我本来也有这个,但在前面纠正了我的错误。我更喜欢这个解决方案,因为它允许我将几乎所有的代码保存在xaml中,以处理关键交互。我目前正在开发一个TextBlock/TextBox可编辑标签,通过这种方式,我可以创建一个新的可编辑样式,可以应用于任何未来的标签。朴素典雅。谢谢卡利森!!这对我有用。我正在为“+”和“-”符号创建触发器。拿着我的东西!