有没有办法按惯例在所有视图中的所有文本框上处理GotFocus事件?

时间:2011-07-06 10:47:49

标签: .net wpf conventions caliburn.micro

我们正在编写一个基于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);
         };

......但我怀疑我在这里走错了路。

是否有更好的链接绑定方法?是否有更好的方法来处理焦点事件/调出键盘?

2 个答案:

答案 0 :(得分:1)

我认为GotFocus是一个冒泡的事件,所以你可以在窗口或页面中添加一个处理程序,然后捕获任何冒泡到元素树顶部的GotFocus事件吗?然后,您可以根据需要处理事件,或者不处理它并允许任何其他注册处理程序处理它。我想唯一的问题是,如果TextBox处理并吞下事件,而且我不确定这一点。

HTH,

巴特

答案 1 :(得分:1)

我以前做过这个。您可以创建一个attached behavior,用于侦听有问题的元素上的PreviewGotKeyboardFocus,从而导致OnScreenKeyboard显示。然后创建一个样式,将附加的行为应用于这些控件。在我的项目中,我们还有不同的键盘用于不同的输入类型(例如文本与数字)。附加行为为其属性设置了KeyboardType。根据KeyboardType,我会显示相应的键盘。

如果您需要进一步的帮助,请与我联系。