Wpf 在特定键上使用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

我希望在触摸特定键(例如空格键)时使用EventTrigger调用命令

目前我有:

  <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
的定义现在未编译)。因此,我将使用custom
RoutedEvent
的工作版本放在这里。
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可编辑标签,通过这种方式,我可以创建一个新的可编辑样式,可以应用于任何未来的标签。朴素典雅。谢谢卡利森!!这对我有用。我正在为“+”和“-”符号创建触发器。拿着我的东西!