自定义OSK:收听TextBox Focus



我已经编写了一个自定义屏幕键盘作为UserControl,以更好地控制用户可以键入的内容(alphanumeric/numpad/navigation键 - 类似的内容(并具有更好的控制在设计时在屏幕布局上。

OSK通过操纵文本盒控制的文本和选择权/函数来工作。

我的主要问题是如何找到正确的文本框以将文本注入。

我的第一种天真方法是注册我要手动使用OSK控件的每个文本框,并使用这些注册文本框的gotFocus/lostfocus确定活动控制:

public void RegisterInput(TextBox text) {
    if (!_listeners.ContainsKey(text)) {
        _listeners.Add(text, modes);
        text.GotFocus += Input_OnGotFocus;
        text.LostFocus += Input_OnLostFocus;
    }
}
private void Input_OnLostFocus(object sender, RoutedEventArgs routedEventArgs) {
    if (_focused == sender) {
        _focused = null;
        IsEnabled = false;            
        UpdateKeyboardMode(); // << Updates Keyboard layout (Alphanumerical vs Numpad) based on focused control
    }
}
private void Input_OnGotFocus(object sender, RoutedEventArgs routedEventArgs) {
    _focused = (TextBox) sender;
    IsEnabled = true;        
    UpdateKeyboardMode();
    Bindings.Update();
}

我在这里与Focus一起工作,因为我需要确定每个文本框显示哪种类型的键盘(全尺寸字母尺寸与短numpad(。然后,_focused文本框用于将压键直接注入其中。在我的页面的构造函数中,还包含OSK控制,我将调用RegisterInput(),并带有我在页面上定义的每个文本框的引用。这很好 - 如果我有这些参考。

,但现在我正在与Usercontrols合作。这也可以删除无法直接引用的文本框,但是我可以在InitializeComponent()之后编写某种VisualTree-Scan来查找所有参考,并在我发现的每个参考文献上调用RegisterInput()。如果我只需要一次这样做,那不是问题(Altough仍然很丑(。

更进一步 - 具有动态变化的内容和数据编制的列表框。现在,我需要在每次发生任何变化时都要明确地重新整个VisualTree。但是如何检测这些变化?

问题是:我可以在我的VisualTree中的任何元素获得/失去焦点的情况下立即获得一个事件,而无需事先知道所有这些元素(从而完全替换RegisterInput()(?或者我可以听视VisualTree的更改以恢复所有控件,然后为我发现的每个文本框手动致电RegisterInput()吗?

目标是每次在UI中的任何文本框/控件上都升高getFocus/lostfocus事件,以便我可以更新键盘以显示全尺寸的字母键盘(用于默认的文本框(或一个缩短了numpad(例如,对于绑定到数值备份字段的文本框(。

替代:是否有其他方法可以注入文本调用UpdateKeyboardMode(),以便在选定的文本框更改后立即更新键盘布局?

我想的其他选项包括:

  1. 构建一个从文本框派生的自定义控件,并让其注册到OSK。如果我找不到更好的方法,我可能会诉诸此方法。但这将破坏对我的控制不存在的第三方库的支持,因此不使用"具有OSK支持的特殊魔法文本框"。

  2. 根本不使用事件。用户按下我的OSK键并将文本注入重点实例后,请立即使用FocusManager进行当前聚焦的文本框。这种方法的问题是,它完全破坏了将OSK调整到不同输入类型(Alphanumerical vs OnlumPad(的能力,因为我无法在按下键之前确定所需的键盘类型。

  3. 用计时器将视觉室恢复。不会那样做,那简直太多了。

  4. 使用Win10 IoT提供的屏幕上键盘。两个问题:它没有设计时间支持,并且在元素上方显示,即使聚焦元素直接在键盘下方(可以接受,如果是必要的(,但是我不知道一种在完整 - 之间更改键盘"布局"的方法大小的字母数字键盘和仅包含数字和一些键的NUMPAD缩短。另外,它不允许使用自定义键(例如导航箭头键,自定义返回键处理(。

在聊天论坛上进行了讨论之后,实际问题不是创建Custom OSK控制并使用它与TextBoxs进行交互,而是"必然使用自定义控制"需要显示OSKtextbox包装。

解决方案是收听OS-OSK事件,当它们触发时,弹出Custom OSK此方法不必将Textbox包裹在用户控制中并在整个项目中使用它。

链接到文档: - 响应触摸键盘的存在

最新更新