Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF应用程序范围内关键向上/向下事件的捕获_C#_Wpf_Events_Key - Fatal编程技术网

C# WPF应用程序范围内关键向上/向下事件的捕获

C# WPF应用程序范围内关键向上/向下事件的捕获,c#,wpf,events,key,C#,Wpf,Events,Key,我试图在WPF应用程序中的任何位置捕获按键事件,而不管哪个UI元素具有焦点。目前我没有运气。有人能提出一些我可能没有尝试过的策略吗?或者,理想情况下,提供一个类似“哦,很简单,你就这么做”的答案 这是一个分布式应用程序,它有一个聊天系统。我想要的效果是,用户可以随时开始键入聊天信息,而无需切换到标准聊天框。我将使用FormattedText对象自己在应用程序中显示它们的消息。这很重要,因为这意味着应用程序中任何地方都没有文本输入元素 我的XAML结构大致如下所示: <MainWindow&

我试图在WPF应用程序中的任何位置捕获按键事件,而不管哪个UI元素具有焦点。目前我没有运气。有人能提出一些我可能没有尝试过的策略吗?或者,理想情况下,提供一个类似“哦,很简单,你就这么做”的答案

这是一个分布式应用程序,它有一个聊天系统。我想要的效果是,用户可以随时开始键入聊天信息,而无需切换到标准聊天框。我将使用FormattedText对象自己在应用程序中显示它们的消息。这很重要,因为这意味着应用程序中任何地方都没有文本输入元素

我的XAML结构大致如下所示:

<MainWindow>
  <Canvas 1>
    <Canvas 2>
      <Image 1 />
    </Canvas 2>
    <Image 2 />
  </Canvas 1>
</MainWindow>

我以编程方式将元素添加到Canvas 2中,并操作图像2,这就是为什么它具有这种结构

我曾尝试将KeyDown、KeyUp和预览事件添加到MainWindow和Canvas 1中,但它们似乎都没有触发(我使用断点进行检查)。在阅读了这里的另一个相关问题之后,我还尝试在Loaded()方法中手动设置主窗口的焦点

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

  • 没有任何答案(我的问题会被回答吗?)
  • 他们假设一个文本输入小部件,并且对冒泡事件感兴趣
  • 他们想要一个密钥绑定,用于少量密钥-我想捕获任何密钥
  • 他们感兴趣的是在捕获事件后检测control/shift/alt键是否已关闭
感谢您抽出时间阅读我冗长的帖子,并感谢您的建议

更新(在Rachel的评论之后)当我放入文本框并将焦点设置为文本框时,主窗口级别的一个键事件方法将触发。这就是广告宣传的效果


然而,我真的不希望在应用程序中有一个显式的文本输入小部件。我希望用户能够开始键入来撰写消息。

我通常会在主窗口中添加PreviewKeyDown事件


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

经过一点修改,我得到了以下结果:

XAML:


政务司司长:

使用System.Windows;
使用System.Windows.Input;
命名空间键输入
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
this.KeyDown+=新的KeyEventHandler(OnButtonKeyDown);
}
私有void OnButtonKeyDown(对象发送方,KeyEventArgs e)
{
test.Content=test.Content+e.Key.ToString();
}
}
}

这会打印出像“Shift”这样的东西,所以你显然必须使用开关。。。但它有一个收集按键的文本框。

受和的答案启发,我设法解决了这个问题。正如他们所演示的,在主窗口级别进行事件捕获确实有效。问题是我忽略了在加载主窗口之前有一个对话框,这似乎干扰了主窗口上的正常键盘焦点。将显式Keyboard.focus()放入Loaded()方法太早。我通过将Keyboard.focus()放在MainWindow\u ContentRendered()方法中修复了这个问题


现在一切都很好(直到下一期)。谢谢你的帮助

这确实有效(添加文本框,在主窗口中预览向下,聚焦到文本框,按键)。我正在更新主要帖子来说明这一点。但是,如果可能的话,我希望避免在应用程序中使用文本框。您关于某些控件不接受键盘焦点的观点很重要。有什么方法可以强制非文本输入控件的键盘焦点?我刚刚测试过,我可以有一个空白窗口,即使没有对象,也可以获取PreviewKeyPressed事件。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>
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();
        }
    }
}