我使用DevExpress控件(DocumentManager和BarManager)编写了几个MDI多标签Winforms应用程序,我试图添加行为,以便取消子窗体(FormEditor)并拖出容器将创建一个容器的新实例(FormMaster.2)并将子项添加到它,因此子窗体始终位于MDI容器中。我正在尝试实现类似于Internet Explorer,Chrome等中的制表符停靠的效果
到目前为止,我的方法导致了一个消失的孩子和一个.NET异常: 无法更改父级控件的顶级样式
EDITED: 在最初的问题中,我注意到我尝试挂钩到ParentChanged事件,并实例化我的MDI父表单的新实例以进行概念验证。这只是暂时的,因为该事件会在孩子脱离时立即触发,这太快了。我设置child.ParentChanged事件以检查Parent == null,然后创建一个新的FormMaster容器并在同一事件中设置MdiParent。它不起作用。
ANSWER :DmitryG向我指出了DevExpress BaseView.FloatingDocumentContainer属性。设置DocumentManager.View.FloatingDocumentContainer = DocumentsHost。使用它对于默认解决方案已经足够了,但您可能希望更进一步,并使用您自己的表单覆盖默认容器。 CustomDocumentsHostWindow事件允许我提供构造函数来实例化我的特定自定义MDI父窗体。表单必须实现IDocumentsHostWindow接口,其中最小的只有两个简单的属性。
感谢DmitryG的正确答案。我在这里为SO读者提供我的最终解决方案代码,根据这里的文档:BaseView.CustomDocumentsHostWindow Event
// FormMain should be setup as an MDIParent with appropriate settings for tabbed MDI, etc.
public partial class FormMain : XtraForm, IDocumentsHostWindow
{
public FormMain()
{
InitializeComponent();
documentManager1.View.FloatingDocumentContainer = FloatingDocumentContainer.DocumentsHost;
documentManager1.View.CustomDocumentsHostWindow +=
(sender, args) => {
args.Constructor = () => new FormMain(); // instantiate my custom parent
};
}
// interface IDocumentsHostWindow
public bool DestroyOnRemovingChildren
{
get { return true; }
}
public DocumentManager DocumentManager
{
get { return documentManager1; }
}
}
这也适用于稍早的DevExpress 12.1。
答案 0 :(得分:2)
据我所知,DevExpress DocumentManager提供了所需的功能,无需任何额外的编码即可使用
FloatingDocumentContainer功能 - 如果BaseView.FloatingDocumentContainer属性设置为DocumentsHost
,浮动文档将托管在可以停靠其他文档的容器中。停靠在这种浮动容器上的文档显示为选项卡。
BaseView.CustomDocumentsHostWindow事件允许您将自定义表单作为浮动文档的主窗口。
P.S。您可以使用其复制Visual Studio 2013 UI的Docking 2013 UI技术演示来使用此功能。 (latest free trial)