为什么textbox.focus会抛出lostfocus事件?

时间:2012-07-06 21:15:20

标签: wpf vb.net

我在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,但焦点不会设置到文本框。想到发生了什么,也许我怎么能解决它?

2 个答案:

答案 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语句。