2008-11-18 77 views
2

我有一個MDI應用程序,允許我打開不同類型的子窗口。我可以打開同一類型的子窗口的多個(但不同的)實例。 (例如:我可以打開3個子窗口類型A實例和2個子窗口類型B實例。所有5個窗口都是不同的實體,除非用戶將相同的數據顯式拖放到多個窗口上,否則不會共享數據。)每個子窗口有一個ToolStripContainer和一個或多個ToolStrips。我該如何預防:如何防止ToolStrip在另一個ToolStripContainer中停靠?

  1. 用戶將ToolStrip從類型A的子窗口拖動到類型爲B的子窗口中的ToolStripContainer?
  2. 用戶將ToolStrip從一個子窗口A的實例拖動到另一個相同類型窗口的實例中的ToolStripContainer?

我試圖阻止用戶從類型A的實例1拖動ToolStrip到類型A的實例2,選擇實例2上的一些東西,然後單擊工具欄上的某個按鈕以獲得一些東西奇怪發生在其他窗口。同樣,將ToolStrip從類型A的窗口拖到類型B的窗口也沒有任何意義 - 這些操作不適用於該類型,但對用戶來說,它看起來像一切都很好,因爲我讓它們執行拖動。

就像爲ControlAdded事件添加我自己的處理程序一樣簡單,還是有更好的方法來做到這一點?我在.NET 3.0中使用WinForms。

編輯:重現步驟

  1. 創建一個新的Windows應用程序項目。
  2. 添加一個新的用戶控件。使用一個按鈕爲控件提供一個ToolStripContainer,其中包含一個ToolStrip。
  3. 重複第2步,給你一個UserControl2類。
  4. 編譯解決方案,以便UserControl1和UserControl2顯示在您的工具箱中。
  5. 將UserControl1和UserControl2拖到窗體上。設置邊界,以便知道邊界的位置。
  6. 運行該應用程序。
  7. 它現在可以從容器拖動ToolStrip的中的UserControl1和其放到UserControl2容器(留在UC1零個ToolStrips和UC2 2個ToolStrips)
  8. 現在想象一下,你只能訪問到的UserControl1代碼。如何防止用戶將ToolStrip拖出ToolStripContainer的實例?
+0

我試圖重現你遇到的問題,但我似乎無法讓它工作。一旦我創建了兩個相同表單的實例,我就無法將工具欄從一個地方拖到另一個地方 – 2008-11-18 22:39:55

+0

請參閱回購步驟。只有一個窗體實例具有兩個單獨的用戶控件,而不是窗體的兩個實例。 – 2011-05-28 21:47:32

回答

0

您是否嘗試過使用ToolStripContainer的DragEnter和DragLeave事件來識別拖過容器的ToolStrip接受或否定它?

+0

只有當您擁有並訪問所有ToolStripContainers時纔有效。見上面的A/B例子。 – 2009-01-06 22:24:32

1

這感覺就像一個黑客,但它的工作原理(種)(對不起,vb.net不是C#):

Public Class UserControl2 

    Private Sub tsMainMenu_BeginDrag(ByVal sender As Object, ByVal e As System.EventArgs) Handles tsMainMenu.BeginDrag 

     tsMainMenu.Tag = tsMainMenu.Parent 

    End Sub 

    Private Sub ToolStrip1_EndDrag(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsMainMenu.EndDrag 


     If Not tsMainMenu.Parent.Parent.Equals(CType(tsMainMenu.Tag, ToolStripPanel).Parent) Then 

      CType(ToolStrip1.Tag, ToolStripPanel).Controls.Add(tsMainMenu) 
     End If 

    End Sub 

End Class 

簡單地說;當控件完成拖動時,如果其父級ToolStripContainer與開始拖動時不相同,請將工具條移回原來的位置。

確定這可以被捲成一個控件,這樣你就不必爲每個工具欄寫它。

編輯: 你可以把所有的代碼,這樣從ToolStripContainer繼承的控制,並讓它做所有的工作對你來說,這意味着一個很好的封裝解決方案。

相關問題