我有一个MDI应用程序,允许我打开不同类型的子窗口。我可以打开相同类型子窗口的多个(但不同)实例。 (示例:我可以打开3个子窗口类型的实例和2个子窗口类型B的实例。所有5个窗口都是不同的实体,除非用户明确地将相同的数据拖放到多个窗口,否则不会共享数据。)每个子窗口有一个ToolStripContainer,带有一个或多个ToolStrips。我该如何预防:
我试图阻止用户将ToolStrip从类型A的实例1拖到类型A的实例2,在实例2上选择一些东西,然后单击工具栏上的按钮只是为了让一些奇怪的事情发生在其他一些窗口。类似地,将ToolStrip从类型A的窗口拖到类型B的窗口是没有意义的 - 操作不适用于该类型,但对于用户来说看起来一切都很好,因为我让他们这样做阻力。
是否像为ControlAdded事件添加自己的处理程序一样简单,或者有更好的方法吗?我在.NET 3.0中使用WinForms。
编辑:重现的步骤
答案 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是否接受或拒绝它?