防止 WPF 文本框失去焦点

8

我有一个 WPF 的 Textbox,在允许失去键盘/焦点之前,我想检查文本值是否正确。

我尝试在 InputBox_LostFocusInputBox_LostKeyboardFocus 事件中设置 e.Handled,但似乎没有达到我的目的。

请问如何锁定 Textbox 的焦点?


5
聚焦锁定会导致用户体验非常糟糕。如果我花费了很多精力尝试去解决这个问题,我会重新设计界面,使其工作方式不同——例如,在“文本框”输入有效内容之前禁用窗口中的所有其他控件。 - Robert Rossney
@Robert:除非你正在设计一个收银机应用程序,否则这几乎是强制性的。在收银应用中,您先输入数字或文本,然后通过按按钮来确定该输入实际上是什么(例如,先输入数字再输入SKU、数量、付款键等)。 - HiredMind
2个回答

11

最好的方法是处理PreviewLostKeyboardFocus事件,该事件在事件向下隧道传输到您的文本框时触发。将handle设置为true,没有其他内容会接收通知(这意味着焦点不会从您的文本框转移)。希望这可以帮助你。


对我来说非常好用,太简单了! - Peter Huber

4
您可以在UIElement上调用Mouse.Capture。这将使您获得发生在元素上或不在元素上的每个鼠标事件,但使用起来有些棘手。您可以在文本框上捕获鼠标并注册失去捕获事件,当您失去捕获时,您可以重新捕获。您必须注意奇怪的行为。通常,不允许用户离开字段是不好的做法(我认为)。更好的方法是允许他们做任何他们想做的事情,但在输入数据后禁用他们按下的按钮,直到所有字段都有效(或类似的操作)。
以下是一些链接: 其他SO问题 MSDN示例代码 组合框使用鼠标捕获来判断用户是否在应用程序中的其他位置单击以关闭组合框(如果打开),如果单击另一个控件(或窗口外部)。
我不确定这种技术是否能阻止您从元素上切换。在WPF应用程序中有两种焦点:逻辑焦点和键盘焦点。多个元素可以同时具有逻辑焦点(每个在焦点范围内)。例如,当您单击菜单时,文本框可以具有逻辑焦点(菜单也具有逻辑焦点)。键盘焦点一次只能在一个地方。您将为自己带来很多工作量。我认为您应该认真考虑您的交互方式是否正确。您可能需要花费几天时间才能正确处理此交互。如果防止文本框失去焦点,那么如果用户单击关闭按钮会发生什么呢?
这是MSDN关于焦点的文章

谢谢Aran,这是很好的建议。也许我会考虑将功能变得不同。 - Mark Pearl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接