2

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

  1. 用户从 A 类型的子窗口中将 ToolStrip 拖到 B 类型的子窗口中的 ToolStripContainer 中?
  2. 用户是否将 ToolStrip 从子窗口 A 的一个实例拖到同一类型窗口的另一个实例中的 ToolStripContainer?

我试图阻止用户将 ToolStrip 从 A 类型的实例 1 拖动到 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 中留下零个 ToolStrip,在 UC2 中留下两个 ToolStrip。)
  8. 现在假设您只能访问 UserControl1 中的代码。如何防止用户将 ToolStrip 拖出 ToolStripContainer 的实例?
4

2 回答 2

1

这感觉像是一个 hack,但它可以工作(有点)(对不起,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 继承的控件中,并让它为您完成所有工作,这意味着一个很好的封装解决方案。

于 2009-05-08T09:23:36.983 回答
0

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

于 2008-12-18T10:40:32.623 回答