我正在尝试在我的WPF应用程序中的任何位置捕获按键事件,无论哪个UI元素具有焦点。目前我没有运气。任何人都可以提出一些我可能没试过的策略吗?或者,理想情况下,提供一个答案,例如“哦,这很容易,你只需这样做。”
这是一个分布式应用程序,它有一个聊天系统。我正在寻找的效果是用户可以随时开始输入聊天消息,而无需切换到标准聊天框。我将使用FormattedText对象在应用程序中显示它们的消息。这很重要,因为这意味着应用程序中没有任何文本输入元素。
我的XAML结构大致如下:
<MainWindow>
<Canvas 1>
<Canvas 2>
<Image 1 />
</Canvas 2>
<Image 2 />
</Canvas 1>
</MainWindow>
我以编程方式将元素添加到Canvas 2中,并操纵Image 2,这就是它具有该结构的原因。
我尝试将KeyDown,KeyUp和预览事件添加到MainWindow和Canvas 1,但它们似乎都没有触发(我用断点检查)。在阅读了另一个相关问题后,我也尝试在Loaded()方法中手动设置焦点在主窗口上。
我意识到这个网站上有很多相关的问题,但他们没有帮助我,因为:
感谢您抽出宝贵时间阅读我冗长的帖子,并感谢您的建议。
更新(在Rachel的评论之后)当我放入TextBox并将焦点设置为TextBox时,将触发MainWindow级别的键事件方法。所以这就像宣传的一样。
但是,我真的希望在应用程序中根本没有明确的文本输入窗口小部件。我希望用户能够开始输入以撰写邮件。
答案 0 :(得分:7)
一点点的修补让我知道了:
XAML:
<Window x:Class="KeyInput.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="100" Width="225">
<Canvas>
<Grid>
<Label Name="test" Content="Empty" />
</Grid>
</Canvas>
</Window>
CS:
using System.Windows;
using System.Windows.Input;
namespace KeyInput
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.KeyDown += new KeyEventHandler(OnButtonKeyDown);
}
private void OnButtonKeyDown(object sender, KeyEventArgs e)
{
test.Content = test.Content + e.Key.ToString();
}
}
}
这会输出像“Shift”这样的东西所以你显然必须使用开关......但它有一个收集按键的文本框。
答案 1 :(得分:3)
我设法解决了这个问题,灵感来自Rachel和WernerCD的答案。正如他们所展示的那样,在MainWindow级别捕获事件确实有效。问题是我忽略了在加载MainWindow之前我有一个对话框,这似乎干扰了MainWindow上的正常键盘焦点。在Load()方法中使用显式的Keyboard.focus()太快了。我通过将Keyboard.focus()放在MainWindow_ContentRendered()方法中来解决问题。
现在一切都很好(无论如何直到下一期)。感谢您的帮助。
答案 2 :(得分:2)
我通常会将一个PreviewKeyDown事件添加到MainWindow。
也许您的问题是您没有任何接受键盘焦点在您的应用程序上的控件。如果将TextBox添加到MainWindow并在那里设置焦点,你会得到相同的结果吗?