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