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

时间:2010-12-03 17:19:30

标签: c# wpf events key

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

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

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

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

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

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

3 个答案:

答案 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)

我设法解决了这个问题,灵感来自RachelWernerCD的答案。正如他们所展示的那样,在MainWindow级别捕获事件确实有效。问题是我忽略了在加载MainWindow之前我有一个对话框,这似乎干扰了MainWindow上的正常键盘焦点。在Load()方法中使用显式的Keyboard.focus()太快了。我通过将Keyboard.focus()放在MainWindow_ContentRendered()方法中来解决问题。

现在一切都很好(无论如何直到下一期)。感谢您的帮助。

答案 2 :(得分:2)

我通常会将一个PreviewKeyDown事件添加到MainWindow。

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

相关问题