本文档描述了如何响应停靠操作,以及在必要时撤销或禁用停靠操作。 关于停靠操作的总说明,请参阅 停靠功能。
禁用停靠操作
停靠面板提供了 DockPanel.Options 属性,其中包含了一组用于控制在面板上的停靠操作的选项:
这些选项允许阻止某个面板被停靠到特定的位置。 但是,它们不能提供完整的对停靠操作的控制。 例如,即使某个面板的 DockPanelOptions.AllowDockBottom 选项被设置为 false,但是此面板仍然可以被停靠到其他已经被停靠到窗体下边缘的面板中。
要解决这个问题,需要把该面板的 DockPanelOptions.AllowDockFill 选项设置为 false,来阻止它被停靠到其他面板中,或者接管 DockManager.Docking 事件。 该事件提供了对停靠操作的更灵活的管理。
选项 | 说明 |
---|---|
DockPanelOptions.AllowDockBottom | 指明停靠面板是否可以被停靠到窗体 (或用户控件) 的下边缘。 |
DockPanelOptions.AllowDockFill | 指明停靠面板是否可以被停靠到其他停靠面板。 |
DockPanelOptions.AllowDockLeft | 指明停靠面板是否可以被停靠到窗体 (或用户控件) 的左边缘。 |
DockPanelOptions.AllowDockRight | 指明停靠面板是否可以被停靠到窗体 (或用户控件) 的右边缘。 |
DockPanelOptions.AllowDockTop | 指明停靠面板是否可以被停靠到窗体 (或用户控件) 的上边缘。 |
DockPanelOptions.AllowFloating | 指明停靠面板是否可以被浮动。 |
响应由最终用户执行的停靠操作
与上面所描述的选项不同,事件提供了对停靠操作的完整控制。 停靠管理器 提供了下列事件,可以在这些事件发生时响应由最终用户在停靠面板上执行的停靠操作,也可以接管这些事件来实现自定义逻辑。
- DockManager.StartDocking
当最终用户开始拖动某个面板时发生。 如果需要,可以接管该事件来取消该拖动操作。
- DockManager.Docking
当面板被停留在某个停靠控件 (其他面板或窗体) 上时发生,如果在当前位置放落被拖动的面板,则它将被停靠。 在目标停靠控件内,被拖动面板潜在的位置由一个框架指示。 可以接管此事件来阻止某个面板被停靠到其他面板 (窗体),等等。
- DockManager.EndDocking
在停靠操作已经被成功完成或被取消之后发生。 在拖动期间,最终用户可以通过按下 ESC 键来取消该次停靠操作。 此事件仅用于提供一个通知。
在默认情况下,最终用户可以双击任意已停靠面板的标题来使它浮动。继续双击浮动面板的标题将把它恢复到先前的位置。 通过把停靠管理器的 BaseDockOptions.FloatOnDblClick 选项设置为 false,可以为所有面板禁用此功能。 要禁用特定面板的此功能,则把该面板的 FloatOnDblClick 选项设置为 false。
示例
下面的示例演示了如何阻止面板被拖出容器,以及阻止它被停靠到其他面板。 这也能阻止最终用户(使用拖放操作导致的自动)销毁已有的容器面板。
DockManager.StartDocking 和 DockManager.Docking 事件被接管,来对停靠操作作出限制。
C# | 复制代码 |
---|---|
using DevExpress.XtraBars.Docking; // Prevent a panel from being dragged from a container. private void dockManager1_StartDocking(object sender, DockPanelCancelEventArgs e) { DockPanel parentPanel = e.Panel.ParentPanel; e.Cancel = parentPanel != null; } // Prevent a panel from being docked to another panel. private void dockManager1_Docking(object sender, DockingEventArgs e) { e.Cancel = e.TargetPanel != null; } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraBars.Docking ' Prevent a panel from being dragged from a container. Private Sub DockManager1_StartDocking(ByVal sender As Object, ByVal e As DockPanelCancelEventArgs) _ Handles DockManager1.StartDocking Dim parentPanel As DockPanel = e.Panel.ParentPanel e.Cancel = Not parentPanel Is Nothing End Sub ' Prevent a panel from being docked to another panel. Private Sub DockManager1_Docking(ByVal sender As Object, ByVal e As DockingEventArgs) _ Handles DockManager1.Docking e.Cancel = Not e.TargetPanel Is Nothing End Sub |