我在SO上看过一些类似的问题,但似乎没有任何东西可以解决这个问题。这是该函数的简化版本。
Private Sub Check_Quantity(sender As System.Object, e As System.Windows.RoutedEventArgs) _
Handles textbox_quantity.LostFocus
Dim worked As Boolean = Integer.TryParse(textbox_quantity.Text, quantity)
If Not worked Then
MsgBox("Enter a valid number for the quantity")
textbox_quantity.Focus()
textbox_quantity.SelectAll()
quantity = 0
End If
End Sub
重要的是要注意这是WPF。我想做的很简单。当某人完成文本框时,程序会检查他们输入的是一个数字。如果确实如此,则将其固定为整数。如果没有,它告诉他们修复它并将焦点保持在文本框上。问题是一些问题,但它归结为这个函数在无限循环中运行。这个函数在WinForms中运行良好,但在WPF中运行不正确。
在其他一些问题上,人们已经说消息框出现导致焦点丢失,但在测试中并非如此。无论是否调用消息框,它仍然循环。问题是调用textbox_quantity.Focus()。没有它,它工作正常。无论它是否存在,虽然textbox_quantity.Focus()仍然返回值true,但焦点不会设置到文本框。想到发生了什么,也许我怎么能解决它?
答案 0 :(得分:2)
问题是,当你调用它时,focus()就会被执行...所以就在焦点被放到另一个控件之前...因此循环...我找到的一个解决方法是推迟使用System.Threading.ThreadPool.QueueUserWorkItem执行此类代码。但由于必须从窗口线程调用focus(),我还必须使用Me.Dispatcher.Invoke。
所以结果有点复杂,但它的确有效!
System.Threading.ThreadPool.QueueUserWorkItem(
Sub()
Me.Dispatcher.Invoke(Sub()
sender.Focus()
sender.SelectAll()
End Sub)
End Sub)
答案 1 :(得分:0)
我会尝试在SelectAll调用之后移动Focus,或者在那里添加一个e.Handled = true语句。