我正在尝试捕获WPF应用程序中任何位置的按键事件,无论哪个UI元素具有焦点.目前我没有运气.任何人都可以提出一些我可能没试过的策略吗?或者,理想情况下,提供一个答案,例如"哦,这很容易,你只需这样做".
它是一个分布式应用程序,具有聊天系统.我正在寻找的效果是用户可以随时开始输入聊天消息,而无需切换到标准聊天框.我将使用FormattedText对象在应用程序中显示它们的消息.这很重要,因为这意味着应用程序中没有任何文本输入元素.
我的XAML结构看起来大致如下:
<MainWindow>
<Canvas 1>
<Canvas 2>
<Image 1 />
</Canvas 2>
<Image 2 />
</Canvas 1>
</MainWindow>
Run Code Online (Sandbox Code Playgroud)
我以编程方式将元素添加到Canvas 2中,并操纵Image 2,这就是它具有该结构的原因.
我已经尝试将KeyDown,KeyUp和Preview事件添加到MainWindow和Canvas 1,但它们似乎都没有触发(我用断点检查).在阅读了另一个相关问题之后,我也尝试在Loaded()方法中手动设置焦点在主窗口上.
我意识到这个网站上有很多相关的问题,但他们没有帮助我,因为:
感谢您抽出宝贵时间阅读我冗长的帖子,并感谢您的建议.
更新(在Rachel评论之后)当我放入TextBox并将焦点设置为TextBox时,将触发MainWindow级别的键事件方法.所以这就像宣传的那样.
但是,我真的希望在应用程序中根本没有明确的文本输入小部件.我希望用户能够开始输入以撰写邮件.
一点点的修补让我这样:
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>
Run Code Online (Sandbox Code Playgroud)
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
打印出像"Shift"这样的东西所以你显然必须使用开关......但它有一个收集按键的文本框.
我通常将 PreviewKeyDown 事件添加到主窗口。
也许您的问题是您的应用程序没有任何接受键盘焦点的控件。如果将文本框添加到主窗口并将焦点设置在那里,您会得到相同的结果吗?
| 归档时间: |
|
| 查看次数: |
23718 次 |
| 最近记录: |