WPF:Popup内子控件的Key Trigger按键触发器无法正常触发
问题原因
Popup默认不属于主窗口的视觉树,且默认不会主动获取键盘输入焦点,按键路由事件无法传递到Popup内部的用户控件,因此绑定在用户控件上的KeyTrigger无法捕获到按键触发。
可行解决方法
方案1:修正焦点控制
首先确保用户控件的Focusable属性设为True,然后给Popup添加Opened事件,在事件触发时强制给用户控件设置焦点:<Popup Opened="Popup_Opened" FocusManager.IsFocusScope="False"> <local:YourUserControl x:Name="MyUserControl" Focusable="True"/> </Popup>后台事件代码:
private void Popup_Opened(object sender, EventArgs e) { MyUserControl.Focus(); }方案2:替换为更稳定的InputBinding实现
直接在用户控件中添加InputBindings替代Interaction的KeyTrigger,路由优先级更高:<UserControl.InputBindings> <KeyBinding Key="Left" Modifiers="Ctrl" Command="{Binding WindowSelectionKeyBackCommand}"/> <KeyBinding Key="Right" Modifiers="Ctrl" Command="{Binding WindowSelectionKeyNextCommand}"/> </UserControl.InputBindings>同时如果出现绑定失效问题,可显式指定绑定源,避免Popup视觉树隔离导致DataContext继承失败:
Command="{Binding DataContext.WindowSelectionKeyBackCommand, RelativeSource={RelativeSource AncestorType=Window}}"方案3:全局捕获按键事件
如果需要按键不限制焦点在Popup内也能触发,直接给顶层窗口注册PreviewKeyDown事件,在事件中判断按键组合后执行对应命令即可。
内容的提问来源于stack exchange,提问作者NovemberMan
相关产品推荐
相关产品推荐

