现在有这样一个需求,窗口要被分割成左右两部分,点击左边的菜单,右边显示对应的窗体(也许是Panel或者Form),并且在主窗口大小变化时,右边的窗体中的控件的位置和大小都能响应的变化,保证能显示出所有的控件。而且右边的窗体在开发期间也能进行可视化编辑。
我原来的做法是,先创建一个Form的窗体,进行可视化编辑,编辑完成后,将其改成从Panel继承而来的组件,并将其显示在主窗体的右半部分。这样做的缺点是,Panel组件无法做可视化编辑(像Form窗体那样)。哪位仁兄能帮忙出出主意,给个完整的解决方案。谢谢!!!!
补充,主窗体是Form + Splitter + Panel的组合。

解决方案 »

  1.   

    to 这样做的缺点是,Panel组件无法做可视化编辑(像Form窗体那样)。哪位仁兄能帮忙出出主意,给个完整的解决方案。谢谢!!!!你可以把Panel部分用UserControl来替换,然后加载到Panel上。
      

  2.   

    你可以把Panel部分用UserControl来替换,然后加载到Panel上。
    ---那自动缩放呢???有办法么???
      

  3.   

    to ---那自动缩放呢???有办法么???初始化usercontrol上面的所有control的anchor位置,我前面已经告诉你方法了。然后在加载usercontrol到panel的时候,把usercontrol.Dock设为fill即可。
      

  4.   

    Knight94(愚翁) : 非常感谢您的帮助,您所说的方法我试了,但出来的结果不是我想要的。您所说的方法的结果是,控件会自动缩放,但缩放的方式是:将窗口拉宽1厘米,控件的宽度就增加1厘米。我说期望的是控件应该是按照比例缩放,包括位置。无论如何,非常感谢您的帮助!!
      

  5.   

    Knight94(愚翁) :您说的方法具体实现是按照如下的方式么??
      UserControl2 us2 = new UserControl2();
      us2.Dock = DockStyle.Fill;
      us2.Parent = this.pl_right;
      pl_right.Controls.Add(us2);
      foreach( Control control in us2.Controls )
      {
        control.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right;
      }
      

  6.   

    VS2005中有新控件(TableLayoutPanel).专门用于布局的
    结合Dock属性使用.基本上可以解决缩放问题.
    使用起来和Web的中table差不多.
      

  7.   

    yeerh(边城浪) :呵呵,兄弟我用的是VS2003,我知道VS2005提供自动缩放的支持了。(AutoSize)
      

  8.   

    to 您说的方法具体实现是按照如下的方式么??
    UserControl2 us2 = new UserControl2();
    us2.Dock = DockStyle.Fill;
    us2.Parent = this.pl_right;
    pl_right.Controls.Add(us2);
    foreach( Control control in us2.Controls )
    {
    control.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right;
    }区分UserControl的加载,和UserControl上面的control加载。
    前者是在窗体初始化的时候,因此在加载UserControl对象的时候,再进行初始化相应的参数;
    后者是定义UserControl的时候,因此你应该在其内部设置各个control的anchor。
      

  9.   

    Knight94(愚翁) : 我对C#不是很精通,还望指教。我在我的UserControl对象初始化的时候进行如下操作:
    public UserControl2()
    {
      // 该调用是 Windows.Forms 窗体设计器所必需的。
      InitializeComponent();  // TODO: 在 InitializeComponent 调用后添加任何初始化
      foreach( Control control in this.Controls )
      {
        control.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
      }
    }不知道是否正确。
    这样出来的结果是,控件能自动缩放,但不是按照比例进行缩放。例如,窗体的宽度从100变成了110,控件的宽度应该是增加百分之十,而现在的效果是控件的宽度也增加了10。我希望的是按照比例增加。
    我在主窗口的又边的Panel的SizeChanged事件中添加如下代码:
      private void pl_right_SizeChanged(object sender, System.EventArgs e)
      {    
        mutexSize.WaitOne();
        if( this.oldHeight == 0 && this.oldWidth == 0 )
        {
          this.oldHeight = this.pl_right.Height;
          this.oldWidth = this.pl_right.Width;
          return;
        }    long newHeight = this.pl_right.Height;
        long newWidth = this.pl_right.Width;    float rateHeight = ((float)newHeight)/oldHeight;
        float rateWidth = ((float)newWidth)/oldWidth;    this.oldHeight = pl_right.Height;
        this.oldWidth = pl_right.Width;    // pl_right == panel
        foreach( UserControl userControl in pl_right.Controls )
        {
          foreach( Control control in userControl.Controls )
          {
            control.Location = new Point( (int) Math.Round(control.Location.X * rateWidth, 0), (int) Math.Round(control.Location.Y * rateHeight, 0));
            control.Size = new Size( (int) Math.Round(control.Size.Width * rateWidth, 0), (int) Math.Round(control.Size.Height * rateHeight, 0));
          }
        }
        mutexSize.ReleaseMutex();
      }但是效果也不好。移动得快了或做了其他什么事情,控件地位置和大小也会乱。规律还没找到,惭愧。
      

  10.   

    按比例,如果你手动调整control的位置和大小的话,就不要用anchor来处理。否则,你又用anchor又再去设置,两者会有干扰。
      

  11.   

    boat2000() :其他的办法当然有,最简单的就是用VS2005,用Autosize属性就好。
      

  12.   

    我也想不明白的是:多窗体怎么依托在右边一个固定区域进行左边treeview节点的导航
      

  13.   

    Knight94(愚翁) :只有Panel的anchor是被设置了的。其它所有在UserControl上的Control的anchor都被清了。做法如下:
      public UserControl2()
      {
       // 该调用是 Windows.Forms 窗体设计器所必需的。
       InitializeComponent();   // TODO: 在 InitializeComponent 调用后添加任何初始化
       foreach( Control control in this.Controls )
       {
        control.Anchor = AnchorStyles.None;
       }
      }
    在反复移动后,UserControl上控件的位置坐标甚至出现了负值!!!
    如果Panel的anchor的也要清掉,那么就要自己手动设置Panel的大小,可是我还不知道如何计算那块区域的大小,望赐教!界面很简单,左边一个ListView, Dock为Left,ListView的右边是一个Splitter,再右边就是Panel了。这个Panel的大小和位置该如何计算呢???
      

  14.   

    boat2000():右边是一个Panel,自己设计其它的UserControl,需要的时候加载到右边的Panel上去。我现在的解决方案是这样的,不知道更好的了,还望谁能指点指点。感激不尽。
      

  15.   

    大制做了一个,没有什么问题
    大致步骤如下:
    1、定义usercontrol的时候,在usercontrol的SizeChanged事件中,去处理缩放
    private void CtrlAutoSize_SizeChanged(object sender, System.EventArgs e)
    {
    //Resize all controls
    Size siz = this.ClientSize;
    btnGet.Bounds = new Rectangle( (int)(siz.Width * 0.01), (int)(siz.Height * 0.01),
    (int)(siz.Width * 0.15), (int)(siz.Height * 0.15) );
    lblTest.Location = new Point( (int)(siz.Width * 0.01) + btnGet.Width + 10 , 
    (int)(siz.Height * 0.01) ); picImage.Bounds = new Rectangle( 
    (int)(siz.Width * 0.01), (int)( siz.Height * 0.01) + btnGet.Height + 10,
    siz.Width - (int)(siz.Width * 0.01) * 2, 
    siz.Height - ((int)(siz.Height * 0.01) + btnGet.Height + 20) ); }2、在窗体加载的时候,如下加载即可
    CtrlAutoSize myControl = new CtrlAutoSize();
    myControl.Visible = true;
    myControl.Dock = DockStyle.Fill;//Set its dock style
    panel1.Controls.Add( myControl );
      

  16.   

    Knight94(愚翁) :首先感谢您一直以来的帮助。您的方法不太符合我现在的需求,您的方法是要自己去计算每个控件的位置(按照百分比),如果控件多了,这种方法就会耗费很多开发时间(不能做可视化编辑),而我希望是能做可视化编辑,然后根据已有的位置信息来进行缩放。但我不知道哪里做得不正确,一直没达到我希望的效果。尤其是有个ListBox,这个控件的大小一直与众不同,气死我了,但这个控件是必须的。郁闷中。
    无论如何,感谢您的帮助。
    最后,还有什么好的点子么??
      

  17.   

    to 尤其是有个ListBox,这个控件的大小一直与众不同,气死我了,但这个控件是必须的。郁闷中。不光是ListBox,还有ComboBox,ListView等等,都有类似的问题。我只是给的个大致方法,至于里面的UI的布局操作,你可以在定义UserControl去做,而真正随着大小而进行缩放是在UserControl的SizeChanged事件中去做,那么这里面你可以用百分比,或者其他比率去做。
      

  18.   

    不光是ListBox,还有ComboBox,ListView等等,都有类似的问题。
    --您知道这几个控件的问题出在哪里么???
    按照您给的百分比的方法,我知道可行得多,但开发周期太长了呀,拖不起呀。
      

  19.   

    http://www.eimhe.com/bbs/adget.php?id=379765美河学习在线——专业视频课程下载基地
      

  20.   

    twozerozerosix(sureSuccess) :我是该恨做广告的还是该感谢你帮我顶了一下呢???犹豫中。
      

  21.   

    free_wang(Yes I do .Net∧) : thanks