0

我在 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 值。有没有想过发生了什么,也许我该如何解决?

4

2 回答 2

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)
于 2012-07-10T09:13:13.987 回答
0

我会尝试在 SelectAll 调用之后移动 Focus,或者在其中添加一个 e.Handled = true 语句。

于 2012-07-06T21:23:05.927 回答