如何防止ToolStrip在另一个ToolStripContainer中停靠?

时间:2008-11-18 04:56:33

标签: c# .net winforms mdi toolstrip

我有一个MDI应用程序,允许我打开不同类型的子窗口。我可以打开相同类型子窗口的多个(但不同)实例。 (示例:我可以打开3个子窗口类型的实例和2个子窗口类型B的实例。所有5个窗口都是不同的实体,除非用户明确地将相同的数据拖放到多个窗口,否则不会共享数据。)每个子窗口有一个ToolStripContainer,带有一个或多个ToolStrips。我该如何预防:

  1. 用户将ToolStrip从类型A的子窗口拖到类型B的子窗口中的ToolStripContainer?
  2. 用户是否将ToolStrip从子窗口A的一个实例拖到同一类型窗口的另一个实例中的ToolStripContainer?
  3. 我试图阻止用户将ToolStrip从类型A的实例1拖到类型A的实例2,在实例2上选择一些东西,然后单击工具栏上的按钮只是为了让一些奇怪的事情发生在其他一些窗口。类似地,将ToolStrip从类型A的窗口拖到类型B的窗口是没有意义的 - 操作不适用于该类型,但对于用户来说看起来一切都很好,因为我让他们这样做阻力。

    是否像为ControlAdded事件添加自己的处理程序一样简单,或者有更好的方法吗?我在.NET 3.0中使用WinForms。

    编辑:重现的步骤

    1. 创建一个新的Windows应用程序项目。
    2. 添加新的用户控件。通过一个按钮为控件提供一个包含一个ToolStrip的ToolStripContainer。
    3. 重复步骤2,为您提供UserControl2类。
    4. 编译解决方案,以便UserControl1和UserControl2显示在工具箱中。
    5. 将UserControl1和UserControl2拖到窗体上。设置边框,以便知道边界的位置。
    6. 运行应用程序。
    7. 现在可以从UserControl1中的容器中拖动ToolStrip并将其放入UserControl2中的容器中(在UC1中保留零ToolStrips,在UC2中保留两个ToolStrips。)
    8. 现在假设您只能访问UserControl1中的代码。如何防止用户将ToolStrip拖出ToolStripContainer的实例?

2 个答案:

答案 0 :(得分: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的控件中,让它为您完成所有工作,这意味着一个很好的封装解决方案。

答案 1 :(得分:0)

您是否尝试使用ToolStripContainer的DragEnter和DragLeave事件来识别拖动容器上的ToolStrip是否接受或拒绝它?