通过键盘将焦点移动到捕获元素外部时进行检测
本文关键字:外部 元素 检测 键盘 焦点 移动 | 更新日期: 2023-09-27 18:00:30
我有这个代码:
Mouse.AddPreviewMouseDownOutsideCapturedElementHandler(this,
OnMouseDownOutsideCapture);
当鼠标点击发生在我的WPF弹出窗口之外时,它会完全捕获(这样我就可以关闭它)。
private void OnMouseDownOutsideCapture(object sender, MouseButtonEventArgs e)
{
if (Mouse.Captured is ComboBox) return;
if (IsOpen)
IsOpen = false;
ReleaseMouseCapture();
}
但我需要一些方法来知道焦点是否通过键盘移动到弹出窗口之外。更具体地说,通过快捷键(即Alt+T)。
现在,当用户以这种方式将焦点移开时,我的弹出窗口不会关闭。有什么想法吗?
我就是这样做的:
将其添加到构造函数:
EventManager.RegisterClassHandler(typeof(UIElement),
Keyboard.PreviewGotKeyboardFocusEvent,
(KeyboardFocusChangedEventHandler)OnPreviewAnyControlGotKeyboardFocus);
然后添加此事件处理程序:
/// <summary>
/// When focus is lost, make sure that we close the popup if needed.
/// </summary>
private void OnPreviewAnyControlGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
// If we are not open then we are done. No need to go further
if (!IsOpen) return;
// See if our new control is on a popup
var popupParent = VLTreeWalker.FindParentControl<Popup>((DependencyObject)e.NewFocus);
// If the new control is not the same popup in our current instance then we want to close.
if ((popupParent == null) || (this.popup != popupParent))
{
popupParent.IsOpen = false;
}
}
VLTreeWalker是一个自定义类,它在视觉树上查找与传入泛型类型的匹配项,然后(如果找不到匹配项,它将在逻辑树上查找。)遗憾的是,我无法在这里轻松发布它的源代码。
this.popup
是您正在比较的实例(您想知道它是否应该关闭)。
您可以添加KeyDown事件并检查是否按下了alt+选项卡。