在C#主窗体的panel容器内动态添加了另一个子窗口(form),为什么不会随着主窗体的大小的改变而改变?

时间:2022-08-30 22:57:24
这是主窗体的关键代码

 this.IsMdiContainer = true;//设置父窗体是容器
sub_form.MdiParent = this;//设置窗体的父子关系
sub_form.Parent = panel_main;//设置子窗体的容器为父窗体中的Panel
sub_form.Show();//显示子窗体,此句很重要,否则子窗体不会显示

当我拖拽主窗体的大小时,子窗体sub_form内的控件并不随着改变.
我已经将主窗体内的panel_main 的Anchor设置为Top, Bottom, Left, Right(既上下左右改变都会随着改变)
而且我试过,panel_main确实在主窗体改变时随着改变了,但为什么panel_main里面的子窗体内的控件不跟随着变化?
是否子窗体还该设置个类似于Anchor的属性?可是子窗体继承自form,没有Anchor的属性....
而且还有个及其郁闷的bug,当我设置子窗体的FormBolderStyle的属性为Sizable后,假设我点击了子窗体的最大化按钮后,子窗体在panel_main内最大化了(很合适的填充了panel_main内的区域),然后我拖动父窗体的大小,子窗体不单单是不会改变,而且当点击恢复按钮(同双击tittle栏相同的功能)恢复后,然后再点击最大化,此时的最大化不会填充现在的父窗体,而是照刚才最大化的大小最大化了....

请问我该怎么设置能达到我想要的效果?先谢谢了

7 个解决方案

#1


看看这个有帮助吗?我还没细看。

MDI and Dock : MDI « GUI Windows Form « C# / C Sharp
http://www.java2s.com/Code/CSharp/GUI-Windows-Form/MDIandDock.htm

#2


不知道你想干什么。MDI子Form也是一个独立的From,为什么要跟随父Form变换呢?还放在Panel里面。你要想这么干,完全可以建一个UserControl,或者直接在Panel里面堆放你子Form里面的控件。

#3


楼上+1,,,,,,,,,,,

#4


額,   我也碰到过这个问题.
用事件处理下吧, 主窗体大小变化时,   在 Resize 里面响应事件 , 传递所需参数,  子窗体直接重设窗体大小.

部分代码:


    #region 窗体大小变化委托
    /// <summary>
    /// 声明主窗体大小变化委托
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public delegate void ResizeEventHandler(object sender, ResizeEventArgs e);

    /// <summary>
    /// 重设窗体大小
    /// </summary>
    public class ResizeEventArgs : EventArgs
    {
        /// <summary>
        /// 显示方式
        /// </summary>
        public FormWindowState fws = FormWindowState.Normal ;
        /// <summary>
        /// X方向位移 (LEFT)
        /// </summary>
        public int x;
        /// <summary>
        /// Y方向位移 (TOP)
        /// </summary>
        public int y;
        /// <summary>
        /// 高
        /// </summary>
        public int height;
        /// <summary>
        /// 宽
        /// </summary>
        public int width;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="msgtype"></param>
        public ResizeEventArgs()
        {
        }

        public ResizeEventArgs(FormWindowState fws)
        {
            this.fws = fws;
        }
    }
     #endregion


//--------------------------------------------------------------------------------------------
//主窗体:
        public event ResizeEventHandler ResizeEvent;


        private void main_Resize(object sender, EventArgs e)
        {
            Process(sender, ResizeEvent);
        }

        public void Process(object sender, ResizeEventHandler process)
        {
            if (process != null)
            {
                ResizeEventArgs e = new ResizeEventArgs();
                int style = 0;
                /*
                swcith(FormBorderStyle)  //子窗体   FormBorderStyle 显示模式
                {
                    case FormBorderStyle.None :
                    {
                    style = 26;
                    }
                    ............
                }
                */
                e.fws = this.WindowState;
                e.x = this.Left;

                e.y = this.Top + style;

                e.width = this.Width;
                e.height = this.Height;
                process(sender, e);
            }
        }

//主窗体中创建子窗体:
        private void test_Click(object sender, EventArgs e)
        {
            Form2 f2= new Form2();
if 
            ResizeEvent += new ResizeEventHandler( f2.myresize);
            Process(sender, ResizeEvent);
           ......
           f2.show();
        }

//子窗体:
        public virtual void myresize(object sender, ResizeEventArgs e)
        {
            try
            {
                if (this.Parent == null)
                {
                    return;
                }
                this.WindowState = FormWindowState.Normal;

                // 指定窗体的位置和大小
                /*
                this.Left   = e.x;
                this.Top  = e.y;
                this.Weight= e.Weight;
                this.Height  = e.Height  ;
                */

                switch(e.fws)   //直接缩放.
                {
                    case FormWindowState.Maximized:
                    {
                        this.WindowState = FormWindowState.Maximized;
                        break;
                    }
                    case FormWindowState.Minimized:
                    {
                        this.WindowState = FormWindowState.Minimized;
                        break;
                    }
                    default:
                    {
                        break;
                    }
                }   
            }
            catch
            {
            }
        }




大概就这样,如果你还想在窗体变化时, 多传点参数到你子窗体,  直接修改下就好.

#5


如果你想在主窗体panl里面创建的窗体, 每次都是最大化,  则   Process  函数里面需要改为   e.fws =  FormWindowState.Maximized;

#6


引用 2 楼 andywangguanxi 的回复:
不知道你想干什么。MDI子Form也是一个独立的From,为什么要跟随父Form变换呢?还放在Panel里面。你要想这么干,完全可以建一个UserControl,或者直接在Panel里面堆放你子Form里面的控件。

先谢谢您的帮忙解答
我其实是想动态的改变panel里的界面,我想过做类似这样的usercontrol来实现,当需要哪个控件的时间,将其余的隐藏,单独显示需要的usercontrol,可是如果panel内的窗口太多,维护起来会很麻烦.
所以 yangb0803 的解答正好解决了我的问题,
真心的感谢各位的帮助

#7


 frm.Dock = this.panel2_content.Dock; 一句代码解决!!

#1


看看这个有帮助吗?我还没细看。

MDI and Dock : MDI « GUI Windows Form « C# / C Sharp
http://www.java2s.com/Code/CSharp/GUI-Windows-Form/MDIandDock.htm

#2


不知道你想干什么。MDI子Form也是一个独立的From,为什么要跟随父Form变换呢?还放在Panel里面。你要想这么干,完全可以建一个UserControl,或者直接在Panel里面堆放你子Form里面的控件。

#3


楼上+1,,,,,,,,,,,

#4


額,   我也碰到过这个问题.
用事件处理下吧, 主窗体大小变化时,   在 Resize 里面响应事件 , 传递所需参数,  子窗体直接重设窗体大小.

部分代码:


    #region 窗体大小变化委托
    /// <summary>
    /// 声明主窗体大小变化委托
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public delegate void ResizeEventHandler(object sender, ResizeEventArgs e);

    /// <summary>
    /// 重设窗体大小
    /// </summary>
    public class ResizeEventArgs : EventArgs
    {
        /// <summary>
        /// 显示方式
        /// </summary>
        public FormWindowState fws = FormWindowState.Normal ;
        /// <summary>
        /// X方向位移 (LEFT)
        /// </summary>
        public int x;
        /// <summary>
        /// Y方向位移 (TOP)
        /// </summary>
        public int y;
        /// <summary>
        /// 高
        /// </summary>
        public int height;
        /// <summary>
        /// 宽
        /// </summary>
        public int width;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="msgtype"></param>
        public ResizeEventArgs()
        {
        }

        public ResizeEventArgs(FormWindowState fws)
        {
            this.fws = fws;
        }
    }
     #endregion


//--------------------------------------------------------------------------------------------
//主窗体:
        public event ResizeEventHandler ResizeEvent;


        private void main_Resize(object sender, EventArgs e)
        {
            Process(sender, ResizeEvent);
        }

        public void Process(object sender, ResizeEventHandler process)
        {
            if (process != null)
            {
                ResizeEventArgs e = new ResizeEventArgs();
                int style = 0;
                /*
                swcith(FormBorderStyle)  //子窗体   FormBorderStyle 显示模式
                {
                    case FormBorderStyle.None :
                    {
                    style = 26;
                    }
                    ............
                }
                */
                e.fws = this.WindowState;
                e.x = this.Left;

                e.y = this.Top + style;

                e.width = this.Width;
                e.height = this.Height;
                process(sender, e);
            }
        }

//主窗体中创建子窗体:
        private void test_Click(object sender, EventArgs e)
        {
            Form2 f2= new Form2();
if 
            ResizeEvent += new ResizeEventHandler( f2.myresize);
            Process(sender, ResizeEvent);
           ......
           f2.show();
        }

//子窗体:
        public virtual void myresize(object sender, ResizeEventArgs e)
        {
            try
            {
                if (this.Parent == null)
                {
                    return;
                }
                this.WindowState = FormWindowState.Normal;

                // 指定窗体的位置和大小
                /*
                this.Left   = e.x;
                this.Top  = e.y;
                this.Weight= e.Weight;
                this.Height  = e.Height  ;
                */

                switch(e.fws)   //直接缩放.
                {
                    case FormWindowState.Maximized:
                    {
                        this.WindowState = FormWindowState.Maximized;
                        break;
                    }
                    case FormWindowState.Minimized:
                    {
                        this.WindowState = FormWindowState.Minimized;
                        break;
                    }
                    default:
                    {
                        break;
                    }
                }   
            }
            catch
            {
            }
        }




大概就这样,如果你还想在窗体变化时, 多传点参数到你子窗体,  直接修改下就好.

#5


如果你想在主窗体panl里面创建的窗体, 每次都是最大化,  则   Process  函数里面需要改为   e.fws =  FormWindowState.Maximized;

#6


引用 2 楼 andywangguanxi 的回复:
不知道你想干什么。MDI子Form也是一个独立的From,为什么要跟随父Form变换呢?还放在Panel里面。你要想这么干,完全可以建一个UserControl,或者直接在Panel里面堆放你子Form里面的控件。

先谢谢您的帮忙解答
我其实是想动态的改变panel里的界面,我想过做类似这样的usercontrol来实现,当需要哪个控件的时间,将其余的隐藏,单独显示需要的usercontrol,可是如果panel内的窗口太多,维护起来会很麻烦.
所以 yangb0803 的解答正好解决了我的问题,
真心的感谢各位的帮助

#7


 frm.Dock = this.panel2_content.Dock; 一句代码解决!!