2012-07-06 155 views
0

我在SO上看到過一些類似的問題,但似乎並沒有真正解決這個問題。這是一個簡化版本的功能。爲什麼textbox.focus會拋出lostFocus事件?

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

@HansPassant什麼?它不是一個函數,它不被我的其他代碼調用,它從一個事件中調用(請注意「Handles textbox_quantity.LostFocus」)。它不會返回任何東西,也不需要。我指的是代碼行textbox_quantity.Focus()返回值爲true時,我檢查返回 – cost 2012-07-06 22:03:02

回答

2

問題是,焦點()執行恰好當你調用它...所以就在焦點被給予其他控制之前...因此循環...我找到的解決方法是推遲使用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) 
+0

非常感謝你,我只想放棄尋找解決方案。你的答案是有效的(我必須添加一些演員才能使用Option Strict On),但我想確保我理解爲什麼。所以你說的是,當我離開textboxt時,它失去了焦點,但是我點擊的任何內容都還沒有得到它。所以文本框失去了焦點,我的小組在這裏放棄了,然後我點擊了焦點,然後再次發射,因爲它再次失去了焦點。該解決方案似乎有點笨拙,但我想不出一個更好的方法來做到這一點。再次感謝! – cost 2012-07-11 22:38:22

+0

是的,你描述的很好。我找不到(對於我的項目)一個簡單的解決方案,讓按鈕被點擊並且焦點返回到第一個控件之後。 – GameAlchemist 2012-07-13 09:32:54

0

我會嘗試在SelectAll調用後移動焦點,或者在那裏添加e.Handled = true語句。

+0

怕這不起作用。在SelectAll之後移動焦點沒有效果,並且將e.Handled設置爲true仍然會使其循環,但是阻止操作系統使光標停止出現在文本框中(所以我有兩個帶有光標的文本框) – cost 2012-07-06 21:45:05

+0

焦點的值是否爲true函數調用結束? – Jin 2012-07-06 21:55:35

+0

如果我調用textbox_quantity.Focus(),焦點的值爲true,但如果我不調用,則爲false。 – cost 2012-07-06 22:08:25

相關問題