Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.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# 按键事件隧道_C#_Wpf - Fatal编程技术网

C# 按键事件隧道

C# 按键事件隧道,c#,wpf,C#,Wpf,我在WPF中具有以下层次结构: 窗口>网格>滚动查看器>堆栈面板>[UserControl1,UserControl2…] 现在我想在窗口对焦后立即在StackPanel中接收按键事件。我如何做到这一点?只是,在StackPanel中向PreviewKeyUp/Down处理程序添加代码似乎不起作用;看起来这些事件不是从窗口通过StackPanel隧道传输的 我应该看看RoutedEventHandler吗 编辑:我注意到,如果堆栈面板具有焦点,则会接收关键事件。否则不会。请确保未处理该事件 例如

我在WPF中具有以下层次结构:

窗口>网格>滚动查看器>堆栈面板>[UserControl1,UserControl2…]

现在我想在窗口对焦后立即在StackPanel中接收按键事件。我如何做到这一点?只是,在StackPanel中向PreviewKeyUp/Down处理程序添加代码似乎不起作用;看起来这些事件不是从窗口通过StackPanel隧道传输的

我应该看看RoutedEventHandler吗


编辑:我注意到,如果堆栈面板具有焦点,则会接收关键事件。否则不会。请确保未处理该事件

例如,如果您有:

 <Grid KeyDown="Grid_KeyDown">
    <ScrollViewer  Name="scrollViewer1" >
        <StackPanel Name="stackPanel1" >
            <TextBox Height="23" Name="textBox1" KeyDown="textBox1_KeyDown" />
        </StackPanel>
    </ScrollViewer>
</Grid>
在方法文本框1_KeyDown中,事件将不buble,这意味着方法
Grid_KeyDown
将不会执行

预览keword的工作方式正好相反。我只是展示了它将成为隧道,而不是像示例中那样冒出气泡的事件

尝试确保事件未被处理。也许用户控件可以处理它。

试试这个

EventManager.RegisterClassHandler(typeof(System.Windows.Controls.Control), System.Windows.Controls.Control.KeyDownEvent, yourdelegate);

将其添加到应用程序启动中。

我注意到,如果堆栈面板具有焦点,则会接收关键事件。否则就不行了。你为什么需要这个功能?你想完成什么?如果在总是触发的事件中执行您想要执行的操作,会发生什么情况?我想在窗口中按下一个键(比如LeftCtrl)时,在所有(聚焦的或非聚焦的)用户控件上显示一个覆盖图。现在,我正在通过查询子项,手动将事件从窗口传播到StackPanel到UserControl。
EventManager.RegisterClassHandler(typeof(System.Windows.Controls.Control), System.Windows.Controls.Control.KeyDownEvent, yourdelegate);