WPF虚拟键盘如何不获得当前焦点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF虚拟键盘如何不获得当前焦点相关的知识,希望对你有一定的参考价值。

用wpf写了个模拟键盘控件,为了处理特殊字符,我在键盘上加了一个按钮,
让它点击后会弹出特殊字符的窗口, 但是这样原来的比如在输入框里的焦点就失去了,自动跑到新窗口里去了,有什么方法让弹出窗口时原来的焦点还不变呢?

由于键盘只是一个控件,所以他会在别的地方被用, 所以我无法将失去的焦点设回去。只能想办法让新的窗口弹出时不拿走原有的focus

不知道 键盘控件 是否和 TextBox 同在一个 Windows 中?

如果是, 将 键盘控件按钮的 Focusable 属性置为 False,
当点击 Button 时, Input 的焦点并不切换, 并不需要写切换回的代码.
如果在 Button Click 时想得到当前 处于输入(inputable) 状态的控件(例如 TextBox), 可以在 Click 事件中:
IInputElement iie=System.Windows.Input.FocusedElement;
if(iie is TextBox) MessageBox.Show((iie as TextBox).Text);

如果 处于输入状态的控件(如 TextBox) 和你的键盘控件不在同一窗口, 可以在 处于输入状态的控件失去焦点时记下此控件, 以便你在处理按钮事件时用.

另一个方法是, 你自定义的控件 可以增加一个 DependencyProperty 来绑定当前处于输入状的控件. 因为你总需要一个事件来激活虚拟键盘, 在这个事件中设置此属性.
参考技术A 另一个方法是, 你自定义的控件 可以增加一个 DependencyProperty 来绑定当前处于输入状的控件. 因为你总需要一个事件来激活虚拟键盘, 在这个事件中设置此属性. 参考技术B 可以从模式对话框还是非模式对话框这个角度考虑考虑

如何将键盘导航焦点传递给 WPF 中生成的 xaml?以及如何退货?

【中文标题】如何将键盘导航焦点传递给 WPF 中生成的 xaml?以及如何退货?【英文标题】:How to pass keyboard navigation focus to generated xaml in WPF? And how to return it back? 【发布时间】:2021-07-26 18:42:04 【问题描述】:

我有内容控制,在这里我正在生成视图,现在我想在这里传递 kayboard 导航焦点。当我点击“返回”时,我想回到以前的键盘导航焦点。

【问题讨论】:

【参考方案1】:

必须先用FocusManager找到现在成为焦点的控件,然后用父元素的所有子元素的VisualTreeHelper进行导航,当当前项tabindex减1且控件tabindex等于重点。

请注意以下示例以阐明解释。

private void Back_Click(object sender, RoutedEventArgs e)

   Control focusedControl = (Control)FocusManager.GetFocusedElement(this);

   DependencyObject child;
   for (int i = 0; i < VisualTreeHelper.GetChildrenCount(focusedControl.Parent); i++)
    
        child = VisualTreeHelper.GetChild(focusedControl.Parent, i);
        if (child is Control)
        
            if (((Control)child).TabIndex == focusedControl.TabIndex - 1)
               ((Control)child).Focus();
        
    

【讨论】:

以上是关于WPF虚拟键盘如何不获得当前焦点的主要内容,如果未能解决你的问题,请参考以下文章

使用 C#/Windows API 的虚拟键盘 - 发送键输入,但不获取焦点

如何使用虚拟键盘写入焦点输入?

如何显示被虚拟键盘隐藏的文本字段?

以编程方式显示/隐藏虚拟键盘

如何使 QInputDialog 触发虚拟键盘显示?

虚拟键盘弹出文本字段的焦点