本人用WeifenLuo实现了一个窗体的左停靠并可自动隐藏,但是如何让两个窗口都停靠在左边并都能自动隐藏,就好像VS2005的解决方案窗口和属性窗口一样另外WeifenLuo里好像是通过操作一个xml文件来存取窗体状态的,操作的原理有知道的吗?DockContent.Show的七个重载谁能讲讲,都是什么意思?

解决方案 »

  1.   

    CSDN不会没人知道吧,不可能,苦等中....
      

  2.   

    ShowHint = WeifenLuo.WinFormsUI.Docking.DockState.DockLeftAutoHide;
    下载这个控件的源代码里面有例子的
      

  3.   

    ShowHint = WeifenLuo.WinFormsUI.Docking.DockState.DockLeftAutoHide; 
    下载这个控件的源代码里面有例子的  这个我知道,针对某一个单独的窗体的操作还行,但是多个就不行了,很多功能做不出来
      

  4.   

    1.关于第一个问题
    通过DockContent.Show重载方法来实现,签名如下,
    public void Show(DockPane previousPane, DockAlignment alignment, double proportion);
    这种方式实现是一种多种DockContent对一个DockPane的内嵌情况,第一个参数指明DockPane,DockAlignment 指明排列方式,
    public enum DockAlignment
    {
        Left,
        Right,
        Top,
        Bottom
    }第三个参数proportion指明先是界面比例,比如:设置DockAlignment.Bottom,proportion为0.5,那会变成上下显示各占一半空间。
    下面是我的程序的部分代码,void testMenu2_Click(object sender, EventArgs e)
            {
                //throw new NotImplementedException();
                //this.Pane.DockTo(this.Pane.DockWindow,null, DockAlignment.Bottom,0.5);
                if (this.Pane.Contents.Count > 1) 
                {
                    this.Show(this.Pane, DockAlignment.Bottom, 0.5);
                }
                
                //this.ShowHint = DockState.DockBottom;
                //object o = this;
            }        void testMenu1_Click(object sender, EventArgs e)
            {
                if (this.Pane.Contents.Count > 1) 
                {
                    this.Show(this.Pane, DockAlignment.Right, 0.5);
                }            
                //throw new NotImplementedException();
                //Invalid value, check DockableAreas property.
                //this.ShowHint = DockState.DockRight;//不允许操作。
            }是否允许实现自动隐藏,只是设置DockContent的DockState属性而已,当然隐藏也有四个方法四种情况,ShowHint是提示性设置,有时候不一定有用,我的一个程序的部分代码参考,void testMenu1_Click(object sender, EventArgs e)//浮动(&F)
            {
                //ToolStripMenuItem item = (ToolStripMenuItem)sender;
                SetShowHint();
                if (this.DockState != DockState.Float)
                {                
                    //this.Show(this.DockPanel, DockState.Float);
                    this.DockState = DockState.Float;
                }
            }
            void testMenu2_Click(object sender, EventArgs e)//可停靠(&K)
            {
                //this.DockState = this.ShowHint;
                SetShowHint();
                switch (this.ShowHint)
                {
                    case DockState.DockLeft:
                    case DockState.DockLeftAutoHide:
                        this.DockState = DockState.DockLeft;
                        break;
                    case DockState.DockRight:
                    case DockState.DockRightAutoHide:
                        this.DockState = DockState.DockRight;
                        break;
                    case DockState.DockTop:
                    case DockState.DockTopAutoHide:
                        this.DockState = DockState.DockTop;
                        break;
                    case DockState.DockBottom:
                    case DockState.DockBottomAutoHide:
                        this.DockState = DockState.DockBottom;
                        break;
                }            
                
            }
            void testMenu3_Click(object sender, EventArgs e)//选项卡式文档
            {
                SetShowHint();
                if (this.DockState != DockState.Document)
                {                
                    this.DockState = DockState.Document;
                }
            }        void testMenu4_Click(object sender, EventArgs e)//自动隐藏(&A)
            {
                SetShowHint();
                
                switch (this.DockState)
                {
                    case DockState.DockLeft:
                        this.DockState = DockState.DockLeftAutoHide;
                        break;
                    case DockState.DockLeftAutoHide:
                        this.DockState = DockState.DockLeft;
                        break;
                    case DockState.DockRight:
                        this.DockState = DockState.DockRightAutoHide;
                        break;
                    case DockState.DockRightAutoHide:
                        this.DockState = DockState.DockRight;
                        break;
                    case DockState.DockTop:
                        this.DockState = DockState.DockTopAutoHide;
                        break;
                    case DockState.DockTopAutoHide:
                        this.DockState = DockState.DockTop;
                        break;
                    case DockState.DockBottom:
                        this.DockState = DockState.DockBottomAutoHide;
                        break;
                    case DockState.DockBottomAutoHide:
                        this.DockState = DockState.DockBottom;
                        break;
                }
            }
            void testMenu5_Click(object sender, EventArgs e)//隐藏
            {
                SetShowHint();
                if (this.DockState != DockState.Hidden)
                {               
                    this.Hide();
                }
            }        private void SetShowHint() 
            {
                if (this.DockState != DockState.Unknown && this.DockState != DockState.Document && this.DockState != DockState.Float && this.DockState != DockState.Hidden) 
                {
                    this.ShowHint = this.DockState;
                }
            }
      

  5.   

    2.第二个问题
    是一个持久化的问题,xml文件只是保存了DockPanel中的DockContent的布局状态,看一下源代码很好理解,通过一个委托来加载配置信息,DockContent是需要另外写代码初始化的,通过委托根据
    DockContent.GetPersistString()返回的信息来匹配配置信息,方法签名如下:
    protected virtual string GetPersistString();
    该方法可以重载,默认的实现为:
    protected virtual string GetPersistString()
    {
        return base.GetType().ToString();
    }
    默认实现缺点很明显,如果同样的DockContent子类会有问题,要解决可以override GetPersistString();
    xml信息保存的信息应该不难看懂,实例如下,<?xml version="1.0" encoding="utf-8"?>
    <!--DockPanel configuration file. Author: Weifen Luo, all rights reserved.-->
    <!--!!! AUTOMATICALLY GENERATED FILE. DO NOT MODIFY !!!-->
    <DockPanel FormatVersion="1.0" DockLeftPortion="0.245884410558149" DockRightPortion="0.253725224881454" DockTopPortion="0.25" DockBottomPortion="0.25" ActiveDocumentPane="-1" ActivePane="-1">
      <Contents Count="4">
        <Content ID="0" PersistString="Zhengzuo.DockPanelSuiteTest.LeftToolWindow" AutoHidePortion="0.25" IsHidden="False" IsFloat="False" />
        <Content ID="1" PersistString="Zhengzuo.DockPanelSuiteTest.RightToolWindow" AutoHidePortion="0.25" IsHidden="False" IsFloat="False" />
        <Content ID="2" PersistString="Zhengzuo.DockPanelSuiteTest.BottomToolWindow" AutoHidePortion="0.25" IsHidden="False" IsFloat="False" />
        <Content ID="3" PersistString="Zhengzuo.DockPanelSuiteTest.PropertyForm" AutoHidePortion="0.25" IsHidden="False" IsFloat="False" />
      </Contents>
      <Panes Count="2">
        <Pane ID="0" DockState="DockLeft" ActiveContent="3">
          <Contents Count="2">
            <Content ID="0" RefID="0" />
            <Content ID="1" RefID="3" />
          </Contents>
        </Pane>
        <Pane ID="1" DockState="DockRight" ActiveContent="1">
          <Contents Count="2">
            <Content ID="0" RefID="1" />
            <Content ID="1" RefID="2" />
          </Contents>
        </Pane>
      </Panes>
      <DockWindows>
        <DockWindow ID="0" DockState="Document" ZOrderIndex="0">
          <NestedPanes Count="0" />
        </DockWindow>
        <DockWindow ID="1" DockState="DockLeft" ZOrderIndex="1">
          <NestedPanes Count="1">
            <Pane ID="0" RefID="0" PrevPane="-1" Alignment="Bottom" Proportion="0.5" />
          </NestedPanes>
        </DockWindow>
        <DockWindow ID="2" DockState="DockRight" ZOrderIndex="2">
          <NestedPanes Count="1">
            <Pane ID="0" RefID="1" PrevPane="-1" Alignment="Bottom" Proportion="0.5" />
          </NestedPanes>
        </DockWindow>
        <DockWindow ID="3" DockState="DockTop" ZOrderIndex="3">
          <NestedPanes Count="0" />
        </DockWindow>
        <DockWindow ID="4" DockState="DockBottom" ZOrderIndex="4">
          <NestedPanes Count="0" />
        </DockWindow>
      </DockWindows>
      <FloatWindows Count="0" />
    </DockPanel>
      

  6.   

    第三个问题
    DockPanel Suite 最新版本是2.2应该没有七个方法,具体如下,public void Show();
    public void Show(DockPanel dockPanel);
    public void Show(DockPane pane, IDockContent beforeContent);
    public void Show(DockPanel dockPanel, Rectangle floatWindowBounds);
    public void Show(DockPanel dockPanel, DockState dockState);
    public void Show(DockPane previousPane, DockAlignment alignment, double proportion);这些方法很难跟你具体的说清楚,真正使用过程中跟其他控件实例有很多关系,下面列出一些情况,楼主应该不难理解。
    Form.IsMdiContainer;
    DockPanel.DocumentStyle;
    DockPane.Contents;
    DockContent.DockAreas;
    DockContent.DockState;
    DockContent.DockPanel;
    设置不同的相关属性都会影响Show方法,而且设置不当,有些Show方法会抛出异常,通过看源代码可以掌握这些情况,源代码比较简洁。
      

  7.   

    都停靠一边的话只要把多个放到一边就行啊
    //f4.DockAreas = WeifenLuo.WinFormsUI.Docking.DockAreas.DockLeft;
    //f5.DockAreas = WeifenLuo.WinFormsUI.Docking.DockAreas.DockLeft;
      

  8.   


    propertyWindow.Show(dockPanel,DockState.DockLeftAutoHide);
      

  9.   

    了解下weifenluo,做窗体正好要用到