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
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 里面响应事件 , 传递所需参数, 子窗体直接重设窗体大小.
部分代码:
大概就这样,如果你还想在窗体变化时, 多传点参数到你子窗体, 直接修改下就好.
用事件处理下吧, 主窗体大小变化时, 在 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
先谢谢您的帮忙解答
我其实是想动态的改变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
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 里面响应事件 , 传递所需参数, 子窗体直接重设窗体大小.
部分代码:
大概就这样,如果你还想在窗体变化时, 多传点参数到你子窗体, 直接修改下就好.
用事件处理下吧, 主窗体大小变化时, 在 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
先谢谢您的帮忙解答
我其实是想动态的改变panel里的界面,我想过做类似这样的usercontrol来实现,当需要哪个控件的时间,将其余的隐藏,单独显示需要的usercontrol,可是如果panel内的窗口太多,维护起来会很麻烦.
所以 yangb0803 的解答正好解决了我的问题,
真心的感谢各位的帮助
#7
frm.Dock = this.panel2_content.Dock; 一句代码解决!!