WPF应用程序广泛捕获关键的上/下事件

cur*_*rsa 9 c# wpf events key

我正在尝试捕获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()方法中手动设置焦点在主窗口上.

我意识到这个网站上有很多相关的问题,但他们没有帮助我,因为:

  • 没有任何答案(我的问题会得到解答吗?)
  • 他们假设一个文本输入小部件,并有兴趣冒泡事件
  • 他们想要少量键的键绑定 - 我想捕获任何键
  • 他们有兴趣在他们已经捕获事件后检测控制/ shift/alt键是否已关闭

感谢您抽出宝贵时间阅读我冗长的帖子,并感谢您的建议.

更新(在Rachel评论之后)当我放入TextBox并将焦点设置为TextBox时,将触发MainWindow级别的键事件方法.所以这就像宣传的那样.

但是,我真的希望在应用程序中根本没有明确的文本输入小部件.我希望用户能够开始输入以撰写邮件.

Wer*_*rCD 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>
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"这样的东西所以你显然必须使用开关......但它有一个收集按键的文本框.


Rac*_*hel 2

我通常将 PreviewKeyDown 事件添加到主窗口。

也许您的问题是您的应用程序没有任何接受键盘焦点的控件。如果将文本框添加到主窗口并将焦点设置在那里,您会得到相同的结果吗?