我们正在编写一个基于WPF的应用程序,通常用于触摸屏平板电脑。我们正在设计UI以避免文本输入,但有时无法避免。对于那些时候我们想要控制何时以及弹出什么类型的键盘进行输入。
我们可以创建一个基本的自定义控件来添加相应的事件处理程序,但我想知道是否有一种方法可以按惯例执行此操作。
我们正在使用CaliburnMicro作为我们的MVVM框架,因为它支持约定,我开始研究ConventionManager.AddElementConvention<TextBox>(null, null, "GotFocus")
,但调用它将取代任何现有的约定。我想到了类似的东西:
var textboxConvention = ConventionManager.GetElementConvention(typeof(TextBox));
var oldBinding = textboxConvention.ApplyBinding;
textboxConvention.ApplyBinding =
(viewModelType, path, property, element, convention) =>
{
element.GotFocus += ((o, args) => ShowKeyboard((TextBox)o));
element.LostFocus += ((o, args) => HideKeyboard((TextBox)o));
return oldBinding(viewModelType, path, property, element, convention);
};
......但我怀疑我在这里走错了路。
是否有更好的链接绑定方法?是否有更好的方法来处理焦点事件/调出键盘?
答案 0 :(得分:1)
我认为GotFocus是一个冒泡的事件,所以你可以在窗口或页面中添加一个处理程序,然后捕获任何冒泡到元素树顶部的GotFocus事件吗?然后,您可以根据需要处理事件,或者不处理它并允许任何其他注册处理程序处理它。我想唯一的问题是,如果TextBox处理并吞下事件,而且我不确定这一点。
HTH,
巴特
答案 1 :(得分:1)
我以前做过这个。您可以创建一个attached behavior,用于侦听有问题的元素上的PreviewGotKeyboardFocus,从而导致OnScreenKeyboard显示。然后创建一个样式,将附加的行为应用于这些控件。在我的项目中,我们还有不同的键盘用于不同的输入类型(例如文本与数字)。附加行为为其属性设置了KeyboardType。根据KeyboardType,我会显示相应的键盘。
如果您需要进一步的帮助,请与我联系。