我已经编写了一个自定义屏幕键盘作为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()
,以便在选定的文本框更改后立即更新键盘布局?
我想的其他选项包括:
构建一个从文本框派生的自定义控件,并让其注册到OSK。如果我找不到更好的方法,我可能会诉诸此方法。但这将破坏对我的控制不存在的第三方库的支持,因此不使用"具有OSK支持的特殊魔法文本框"。
根本不使用事件。用户按下我的OSK键并将文本注入重点实例后,请立即使用FocusManager进行当前聚焦的文本框。这种方法的问题是,它完全破坏了将OSK调整到不同输入类型(Alphanumerical vs OnlumPad(的能力,因为我无法在按下键之前确定所需的键盘类型。
用计时器将视觉室恢复。不会那样做,那简直太多了。
使用Win10 IoT提供的屏幕上键盘。两个问题:它没有设计时间支持,并且在元素上方显示,即使聚焦元素直接在键盘下方(可以接受,如果是必要的(,但是我不知道一种在完整 - 之间更改键盘"布局"的方法大小的字母数字键盘和仅包含数字和一些键的NUMPAD缩短。另外,它不允许使用自定义键(例如导航箭头键,自定义返回键处理(。
在聊天论坛上进行了讨论之后,实际问题不是创建Custom OSK
控制并使用它与TextBoxs
进行交互,而是"必然使用自定义控制"需要显示OSK
的textbox
包装。
解决方案是收听OS-OSK事件,当它们触发时,弹出Custom OSK
此方法不必将Textbox
包裹在用户控制中并在整个项目中使用它。
链接到文档: - 响应触摸键盘的存在