2008-11-18 75 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继承的控制,并让它做所有的工作对你来说,这意味着一个很好的封装解决方案。

相关问题