DockPanel的基本使用

DockPanel的基本使用 我就不说了,网上很多,我想说的是在使用DockPanel时 需要注意的几个小问题

第一个:

使用过DockPanel的人,都有可能会遇到这样一个错误:

Invalid Content: ActiveContent must be one of the visible contents, or null if there is no visible content.

翻译过来的意思大致是:无效的内容: 如果没有一个可见的内容,ActiveContent必须是可见的内容或空。

具体是什么原因,大家可以相互探讨下。下面我说说出现这个问题的几种情况

代码中的this关键字代表的就是Dockpanel所在的窗体为Form1

1)、当Dockpanel的DocumentStyle不为DockingMdi时,以下代码会出现这个问题

Frm_A frmA = null;
       //判断子窗体中是否已经存在在DockPanel中
       foreach (DockContent frm in this.dockPanel1.Contents)
        {
             if (frm is Frm_A)
              {
                    frm.Activate();     //激活子窗体
                    return;
              }
            }

frmA = new Frm_A();
            frmA.MdiParent = this;
            frmA.Show(this.dockPanel1);

解决方案:看你设置Dockpanel的DocumnetStyle是否为DockingMdi。大家也可以试试其他几种方式(DockingWindow,DockingSdi,SystemMdi)

2)、设置了Dockpanel的DocumentStyle不为DockingMdi时,如果你想要设置窗体Frm_B为左边浮动窗体,需要设置窗体Frm_B的DockAreas为且仅为DockLeft,如果想要实现其他功能可自行去设置其他属性信息,现在请看下面代码

Frm_B frmB = null;
            //判断子窗体中是否已经存在在DockPanel中
            foreach (DockContent frm in this.dockPanel1.Contents)
            {
                if (frm is Frm_B)
                {
                    frm.Activate();     //激活子窗体
                    return;
                }
            }

frmB = new Frm_B();
            //frmB.MdiParent = this;
            frmB.Show(this.dockPanel1,DockState.DockLeft);

注意,如果你在你的代码中加了红色注释的代码,那么程序运行时 也会报上面的那个错

解决方案:注释红色的代码。

原因:(个人理解)frmB.Show(this.dockPanel1,DockState.DockLeft);这句代码其实就设置了frmB只停靠在DockPanel左边,此时的frmB是不属于MDI子窗体的,所以一旦你加入红色的代码,程序就会报错。

第二个:

拖动、停靠、固定子窗体(显示在Dockpanel中)

拖动:如果你想使你的子窗体可以任意拖动,那么你在设置子窗体的DockAreas属性时,保持默认值,不要修改。

停靠:首先你需设置DockAreas的位置,可以停靠在左、右、下等,也可以通过程序代码控制,参考上面代码。

固定:只需设置你窗体的DockAreas为Document就行了

第三个:

子窗体和Contents的判断

很多时候你需要判断Dockpanel中存在多少个子窗体或Contents,请参考下面代码:

foreach(Form in this.MdiChildren)

{

//这样判断时,停靠的窗体是不会计算在内的

}

foreach (DockContent frm in this.dockPanel1.Contents)
 {

//这样设置后,所有的继承与DockContent的窗体都会被计算在内的

}

第四个:

寻找主窗体、动态显示子窗体

参考图:

实现的功能:这里我们需要实现,右键点击A窗体,通过右键菜单来显示窗体B。

//主窗体的对象
  Form1 form1;

private void showB_Click(object senders, EventArgs e)
 {

GetFrmMain();  //通过此函数来获取form1

foreach (Form frm in form1.MdiChildren)
            {
                if (frm is Frm_B)
                {
                    frm.Activate();
                    return;
                }
            }

Frm_B frmB = new Frm_B(this);
            frmB.MdiParent = form1;
            frmB.Show(form1.dockPanel1);

}

private void GetFrmMain()

{

if (this.Parent.Parent.Parent.Parent != null)
                {
                    form1 = (Form1)this.Parent.Parent.Parent.Parent;
                }
                else
                {
                    form1 = (Form1)this.Parent.Parent.Parent;
                }

}

现在是在A窗体中,this关键字已经代码的不是主窗体了,那么这里我们就需要获取主窗体对象

当A窗体停靠时,需要this.Parent.Parent.Parent.Parent(四个)

不停靠时,只需要三个this.Parent.Parent.Parent

调试代码发现:停靠时

this.Parent 为 {WeifenLuo.WinFormsUI.Docking.DockPane}

this.Parent.Parent 为 {WeifenLuo.WinFormsUI.Docking.DockWindow, BorderStyle: System.Windows.Forms.BorderStyle.None}

this.Parent.Parent.Parent 为 {WeifenLuo.WinFormsUI.Docking.DockPanel, BorderStyle: System.Windows.Forms.BorderStyle.None}

this.Parent.Parent.Parent 为 {TestEvenhandler.Form1, Text: Form1} 就是我们要找的主窗体Form1

不停靠时:

this.Parent 为 {WeifenLuo.WinFormsUI.Docking.DockPane}

this.Parent.Parent 为 {WeifenLuo.WinFormsUI.Docking.DockPanel+AutoHideWindowControl, BorderStyle: System.Windows.Forms.BorderStyle.None}

this.Parent.Parent.Parent 为 {TestEvenhandler.Form1, Text: Form1} 就是我们要找的主窗体Form1

四个小问题,也算不上技巧,是我在开发中遇到过的,里面的缘由可能解释不是很清楚,忘大家相互探讨,共同进步。

DockPanel的基本使用

时间: 2024-12-15 16:41:40

DockPanel的基本使用的相关文章

Winform中DockPanel(引用WeifenLuo.WinFormsUI.Docking.dll组件)的使用

WeiFenLuo.WinFormsUI.Docking.dll是开源项目DockPanel Suite的一个类库,可实现像Visual Studio的窗口停靠.拖拽等功能.WeifenLuo.WinFormsUI.Docking是一个很强大的界面布局控件,可以保存自定义的布局为XML文件,可以加载XML配置文件.DockPanel中提供了几个可用的类,重要的有两个:DockPanel和DockContent.DockPanel是从Panel继承出来的,用于为可浮动的dock的子窗口提供进行浮动

ArcGIS AddIN 之 DockPanel 界面空白

辛辛苦苦写了个AddIn插件,自己用一切正常,发给别人就弹不出DockPanel, 或者弹出时只有Panel,没有具体的控件.经多次排查,原因是: 使用了第三方的界面控件DotNetBar,开发环境中由于DotNetBar配置正常,所以一切正常, 而其他人电脑没有DotNetBar,所以导致了DockPanel空白. 解决方法:电脑上装DotNetBar 控件

WrapPanel 和 DockPanel

WrapPanel 和 DockPanel 两个是比较简单的布局容器. 这两个控件将弥补 StackPanel 的某些不足 WrapPanel 控件: 该控件一句 Orientation 属性, 在垂直堆放控件或者行中放置控件方面, WrapPanel 于 StackPanel 类似. 除了堆叠放外, WrapPanel 还包含的控件提供了换行支持. 如果在 WrapPanel 控件提供的内容宽度超过了容器,就会自动换行. DockPanel 控件: DockPanel 提供了停靠支持. 以便可

WPF教程四;布局之DockPanel面板

DockPanel:停靠面板 DockPanel定义一个区域,在此区域中,您可以使子元素通过描点的形式排列,这些对象位于 Children 属性中.停靠面板类似于WinForm中控件的Dock属性.DockPanel会对每个子元素进行排序,并将根据指定的边进行停靠,多个停靠在同侧的元素则按顺序排序.在DockPanel中,指定停靠边的控件,会根据定义的顺序占领边角,所有控件绝不会交叠. 默认情况下,后添加的元素只能使用剩余空间,无论对DockPanel的最后一个子元素设置任何停靠值,该子元素都将

WPF 布局控件 之 DockPanel

DockPanel为容器控件 主要了解其Dock属性和LastChildFill属性的使用 一.LastChildFill="True" 时 代码: <DockPanel LastChildFill="True"> <Button DockPanel.Dock="Top">Top</Button> <Button DockPanel.Dock="Bottom">Bottom<

DevExpress添加Winform窗体到DockPanel

在使用DevExpress过程中,原先已经创建好的导航窗体,如何添加到DockPanel中进行展示? FormX frmX = new FormX(); frmX.Show(this.DockPanel1); frmX.Dock = DockStyle.Fill;   frmX.TopLevel = false; frmX.FormBorderStyle = FormBorderStyle.None; this.DockPanel1.Text = frmX.Text; this.DockPane

WPF笔记(2.2 DockPanel)——Layout

原文:WPF笔记(2.2 DockPanel)--Layout 读完了这一节,发现DockPanel就是过去winform中的Dock属性.原来的Dock属性是子控件设置,而其父亲级别不用设置.现在WPF改为在父亲级别抽象出一个DockPanel,然后设置其下子控件的Dock属性. <DockPanel LastChildFill="True">    <Button DockPanel.Dock="Left">Left</Button

DockPanel与GeckoFX、ChrominumFX、CefSharp结合使用问题

在使用DockPanel与ChrominumFx时,当在以下条件下拖动窗体时,会发生ChromiumWebBrowser崩溃的情况,此种情况也会在DockPanel与GeckoFX或CefSharp结合使用时出现. 出现条件: 当Form表单初始时以DockState.Document,然后拖动此表单到非DockState.Document模式时,可以是DockState.Left.DockState.Right或其他. 当Form表单初始时以非DockState.Document时,然后拖动此

WPF入门教程系列九——布局之DockPanel与ViewBox(四)

七. DockPanel DockPanel定义一个区域,在此区域中,您可以使子元素通过描点的形式排列,这些对象位于 Children 属性中.停靠面板其实就是在WinForm类似于Dock属性的元 素.DockPanel会对每个子元素进行排序,并停靠在面板的一侧,多个停靠在同侧的元素则按顺序排序. 如果将 LastChildFill 属性设置为 true(默认设置),那么无论对 DockPanel 的最后一个子元素设置的其他任何停靠值如何,该子元素都将始终填满剩余的空间.若要将子元素停靠在另一