2017-08-03 86 views
0

我試圖在VB.Net的Windows窗體上動畫兩個按鈕的運動。窗體從主窗體中加載ShowDialog()。我有以下代碼:動畫按鈕運動

Private Sub MoveButtons(sender As Object, e As EventArgs) Handles picLogo.Click 
    Dim SLoc As Point = btnSearch.Location 
    Dim CLoc As Point = btnCancel.Location 

    txtSearch.Enabled = False 
    txtSearch.Visible = False 
    btnSearch.Text = "Add" 

    For idx As Integer = 1 To 36 
     SLoc.Y -= 1 
     btnSearch.Location = SLoc 
     CLoc.Y -= 1 
     btnCancel.Location = CLoc 
     Thread.Sleep(5) 
    Next 
End Sub 

我最初的代碼它使用Top財產,但結果是一樣的。取消按鈕按預期向上滑動,但搜索/添加按鈕從下往上消失,然後跳到正確的位置。不管我是否更改按鈕文本,都會發生這種情況。除了明顯的LocationText屬性之外,兩個按鈕是相同的,但取消按鈕的DialogResult設置爲DialogResult.Cancel

Form screenshots

+0

討厭這樣說,但...把'Application.DoEvents()''之前Thread.sleep代碼(5)' – djv

+0

不過說真的,沒有。看到我的回答 – djv

回答

1

你是不是給UI任何時間來正確進行自我更新。儘管Thread.Sleep(5)對您的循環時間至關重要,但它也將UI線程置於睡眠狀態。你不想這樣做。

因此,一個簡單但不知情的修復方法是將Application.DoEvents()放入循環中。這將允許UI自行更新。這應該使你的代碼工作...

... 
Application.DoEvents() 
Thread.Sleep(5) 

但如果這種類型的東西做的話,你會發現你的UI減慢。它會給應用程序帶來不好的感覺。你永遠不想讓UI線程進入睡眠狀態。

你應該做的是從UI中取出所有非UI的東西。你可以創建一個線程並把它放在那裏。但是,在線程內部,您需要將任何UI調用回Invoke。以下是我

Private Sub MoveButtons(sender As Object, e As EventArgs) Handles picLogo.Click 
    txtSearch.Enabled = False 
    txtSearch.Visible = False 
    btnSearch.Text = "Add" 
    Dim moveThread As New System.Threading.Thread(AddressOf moveButtonsSub) 
    moveThread.Start() 
End Sub 

Private Sub moveButtonsSub() 
    Dim SLoc As Point = btnSearch.Location 
    Dim CLoc As Point = btnCancel.Location 
    For idx As Integer = 1 To 36 
     SLoc.Y -= 1 
     CLoc.Y -= 1 
     Me.Invoke(
      Sub() 
       btnSearch.Location = SLoc 
       btnCancel.Location = CLoc 
      End Sub) 
     Thread.Sleep(5) 
    Next 
End Sub 
+0

太棒了!我不確定你的意思是「UI外的非UI內容」(我會學習!),但你的解決方案完美無缺。然而,我在'Sub()'裏面移動了'For-Next'循環,然後回到使用'Top'屬性。 – alanlittle

+0

Windows窗體應用程序開始在UI線程上運行(簡單的解釋)。但是如果你有一個以上的核心cpu,你應該在UI線程上做最少的處理。您可以通過產生其他非UI線程來完成此任務,您將在其中執行計算等。但是,您無法從這些非UI線程訪問UI元素,即控件。所以你必須調用任何訪問UI線程上的控件的代碼(Control.Invoke)。請參閱[this](https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/how-to-make-thread-safe-calls-to-windows-forms-controls)瞭解更多信息。 – djv

+0

好吧,我明白了。有趣。這給了我一些其他應用程序的思考。謝謝。 – alanlittle