如何从 WPF 页面触发 KeyDown 事件

Posted

技术标签:

【中文标题】如何从 WPF 页面触发 KeyDown 事件【英文标题】:How do i get a KeyDown event to fire from a WPF Page 【发布时间】:2020-07-05 04:51:18 【问题描述】:

目标:在 WPF 页面中,我希望用户能够按下预定的键序列,这些键将触发导致控件(按钮)出现的事件。我已经查看了所有可以找到的 KeyDown 和 Keyboard.KeyDown 事件,它们似乎没有在后面的代码中触发事件。

XAML:

<Page x:Class="KioskClient.Begin"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core" 
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" 
xmlns:local="clr-namespace:KioskClient"
xmlns:uc="clr-namespace:KioskClient"

xmlns:controls="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

mc:Ignorable="d" 
d:DesignHeight="450" d:DesignWidth="800"    
Background="Black" 
Title="SIMS Check In"
Keyboard.KeyDown="Page_KeyDown"
>

<DockPanel LastChildFill="True" Background="Black">

<!--Since you always want the Back, Next, Cancel button to be docked to 
the bottom of the screen, put them first in the Dockpanel and dock them, 
the other objects then fill the space.-->
<controls:UniformGrid Margin="100" Rows="1"
HorizontalAlignment="Center"
VerticalAlignment="Bottom" Background="Black" DockPanel.Dock="Bottom">
</DockPanel>
</Page>

C#:

private void Page_KeyDown(object sender, KeyEventArgs e)

一旦我可以触发事件但事件没有触发,我就知道该怎么做。除了我设置“this.Focusable = true;”的页面本身,我不想专注于任何事情。在构造函数中。显然,我错过了一些东西。谁能告诉我这是什么?

【问题讨论】:

【参考方案1】:

请改用Keyboard.KeyDown。这应该可以解决您的问题。

<Window ...
    Keyboard.KeyDown="Page_KeyDown">
    ...
</Window>

【讨论】:

感谢 Keithernet,但 Keyoard.KeyDown 也不起作用。经过进一步努力,我发现如果我将焦点放在文本框上,该事件将触发。问题是我不想专注于页面本身以外的任何事情。 我使用一个没有控件的窗口做了一个完整的工作示例。你有什么遗漏吗?您的窗口的 XAML 是什么样的? 我在上面贴了一个例子。抱歉格式化。 我创建了一个应用程序,它运行良好。出于某种原因,它不适用于 WPF 页面,但它确实适用于 WPF 窗口。我在我的应用程序中使用 WPF 页面而不是 WPF Windows。 问题已解决:当使用 Keyboard.KeyDown 事件时,它必须在父窗口中完成,在我的例子中是 MainAppWindow。这会在其子页面中发生键事件时触发,然后可以使用修饰符对键组合进行修改以忽略或确认某些键按下,或者使用 if/else 语句用于单个键按下。要从某些页面忽略按键事件,请使用 PreviewKeyDown 事件而不是 KeyDown 事件。当按键组合发生在我不想要的其他页面时,这让我可以忽略。

以上是关于如何从 WPF 页面触发 KeyDown 事件的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止 WPF KeyDown 事件从某些包含的控件(例如 TextBox)冒泡?

wpf中 closing事件和unload事件有啥区别?

如何以编程方式在 ExtJS 4 中触发 keydown 事件

Tab 不会触发 keydown 或 keypress 事件

用`which`属性以编程方式触发keydown事件

js keyupkeypress和keydown事件 详解