3
我已經縮小我的問題這個簡單的例子,但似乎無法找到發生了什麼:VB形式重新出現,而無需請求
- 我有兩種形式,通過單一按鈕,其他空。
- 單擊按鈕時,Form1中隱藏和顯示窗口2
- showung起來的時候,窗口2將隱藏,並顯示Form1中再次
此外,進入VisibleChanged
時,窗體2將與一個MsgBox 停止代碼如下。
現在預期的行爲,在點擊按鈕時會
- Form1中隱藏
- 第一MSGBOX可見轉向真正由於Form1中調用Form2.show
- 可見第二MSGBOX由於轉向假窗體2調用Me.hide
- Form1中顯示出來
都這樣做happend,但隨後,
- 窗體2顯示出來(Form1中仍然存在)
- 一個MsgBox顯示出來(告知form2.visible再次真)
- 一個MsgBox顯示出來(告訴現在form2.visible爲False)
- Form2皮革
任何想法爲什麼?
下面的代碼:
Public Class Form1
Private Sub ButtonGO_Click(sender As Object, e As EventArgs) Handles ButtonGO.Click
Me.Hide()
Form2.Show()
End Sub
End Class
也
Public Class Form2
Dim calls As Integer = 0
Private Sub Form2_VisibleChanged(sender As Object, e As EventArgs) Handles Me.VisibleChanged
calls += 1
MsgBox("calling : " & calls & "/Me.Visible : " & Me.Visible)
If Me.Visible Then
Me.Hide()
Form1.Show()
End If
End Sub
End Class
顯然從一個VisibleChanged處理函數調用Me.Hide會在原始處理程序返回後再次發生該事件。也就是說,調用'Hide'會導致立即嵌套的'VisibleChanged'像它應該,第二個處理程序退出什麼都不做,控制繼續到'Form1.Show'並退出原始處理程序,然後再次發生'VisibleChanged'。我不確定這是一個錯誤還是某種模糊但預期的,但如果你想讓它停止,我建議你從其他事件調用'Me.Hide',而不是'VisibleChanged'。 – GSerg
Winforms中的Visible屬性是一個非常重要且非常不直觀的屬性。將其設置爲True(或調用Show,同樣的事情)會產生很多副作用,這是Winforms用來創建本機窗口的觸發器。有一件事你不能做的就是在地板墊上猛地一下,並且在任何由於窗戶被創建或顯示而運行的事件中將其重新設置爲False。當你發現了。目前還不清楚爲什麼要這樣做,但打敗Show()的唯一方法是在調用MyBase.SetVisibleCore()之前,重寫SetVisibleCore()並將參數設置爲False。 –
嗨hans。這個結論的關鍵是要執行一些檢查,如果它們失敗,表單將拒絕顯示。我清楚地看到,這可以在調用form2.show之前完成。但是,我的觀點是要理解我偶然發現的奇怪行爲。現在我嘗試用'Me.SetVisibleCore(False)'替換form2中的'Me.hide()',並且我仍然得到相同的行爲。我弄錯你了嗎? – user3617487