2010-02-06 134 views
6

我有一个WPF Textbox,我希望在检测文本值是否正确之前允许它丢失键盘/焦点。阻止WPF文本框失去焦点

我已经尝试在InputBox_LostFocus & InputBox_LostKeyboardFocus事件中设置e.Handled,但它似乎并没有达到我想要的。

关于如何锁定焦点到Textbox的建议?

+5

焦点锁定会造成非常可恶的用户体验。在我花费大量精力试图弄清楚如何做到这一点之前,我会重新设计用户界面以不同的方式工作 - 比方说,禁用窗口中的其他所有控件,直到“TextBox”具有有效内容为止。 – 2010-02-06 19:03:19

+0

@Robert:除非您正在设计收银机应用程序,否则它实际上是强制性的。在注册应用程序中,您输入一个数字或文本,然后通过点击按钮来决定实际输入的内容。 (例如编号然后SKU,编号然后数量,编号然后支付钥匙等) – HiredMind 2012-04-06 23:09:27

回答

4

您可以致电Mouse.Capture联系UIElement。这会给你带来的每一个鼠标事件都会影响元素与否。但使用起来很棘手。您可以在文本框中捕获鼠标并注册丢失的捕获事件,当您丢失捕获时可以重新捕获。你必须警惕奇怪的行为。一般来说,它的糟糕做法(我认为)不允许用户离开现场。什么是更好的是,让他们为所欲为,但禁止他们进入数据后推,直到所有的字段都有效(或类似的东西)

这里的按钮有一些链接

other SO question

msdn sample code

组合框中使用鼠标捕获来告诉用户是否点击了应用程序的其他地方关闭组合框,如果它的开放,如果你点击另一个控制(或窗外)

我不知道这种技术是否会阻止你剔除元素。在wpf应用程序中有两种焦点。你有逻辑焦点和键盘焦点。多个元素可以同时具有逻辑焦点(每个元素都在焦点范围内)。认为例如一个文本框可以有逻辑焦点,而你点击一个菜单(它也有逻辑重点)。键盘焦点一次只能在一个地方。你会为自己做很多工作。我会认真考虑你是否以正确的方式进行互动。你可能花费数天时间才能正确地进行交互如果您停止了文本框失去焦点,如果用户单击关闭按钮会发生什么情况?

继承人的msdn article on focus

+0

谢谢亚兰,这是很好的建议。也许我会看看功能有所不同。 – 2010-02-06 13:14:18

7

要做到这一点,最好的办法是处理,而事件被隧道到您的文本框被解雇的PreviewLostKeyboardFocus事件。将句柄设置为true,并且其他任何内容都不会收到通知(这意味着焦点不会从您的文本框中转移)。希望这可以帮助。

+0

工作就像一个魅力对我来说。很简单 ! – 2016-05-06 13:47:41