显示最上面的子窗体 c#
Show top most Child Form c#
如何在我的父窗体中显示最顶部的按钮单击子窗体(带有作为填充停靠的 tabcontrol)?
它总是在父窗体的tabcontrol后面显示窗体,我什至用过:
frm.TopMost = true;
frm.BringToFront();
还在后面显示。
请说明您正在使用哪些框架的哪些组件以及您目前所做的工作。如果没有这些信息,我建议采用以下解决方案(未经测试)。
在您的 ParentForm 的 "ButtonClick" 事件中执行此操作:
ChildForm cf = new ChildForm();
cf.MdiParent = this;
cf.Show();
如果这不起作用,您可以添加一个
cf.Focus();
你想要的是不可能的。控件的 MDI children 显示在名为 MdiClient
的控件上(您不能直接 select),它不是 transparent(并且不能) 并且默认情况下,始终位于 parent 形式的其他控件的后面。
所以唯一的方法就是让 MdiClient
覆盖 parent 表单中的控件:这会达到您的预期,但它也会隐藏 parent 控制何时没有显示 child 表单(再一次,MdiClient
不是,也不能是 transparent)。
所以唯一合理的方法是使用 TabControl
最大化 child 形式,而不是直接在 parent.[=20 上使用 TabControl
=]
或者您可以让 TabControl
仅在没有 child windows 时显示。为此,以 parent 形式制作一个计时器,并在每个时间间隔检查一次:
if(MdiChildren.Length > 0)
myTabControl.SendToBack();
else
myTabControl.SendToFront();
这仅在 MDI children 始终最大化时才有效:当有任何 children 时,您的 TabControl
将不可见(无论它们是否覆盖它或不)
更新
如评论中所述,您可以 "your own MDI",方法是在 parent 表单中使用主机控件(例如 Panel
)并加载 [=56] =] 该控件中的表单:
var form = new ChildForm();
form.TopLevel = false;
form.Parent = myHostPanel;
form.Show();
这将在面板内显示表单(您可以在其中找到它并在您想要的位置进行 zorder)...但是您失去了所有 MDI 管理,并且您必须跟踪您的 child ren(并在需要时处理表单事件)自己。
我不会使用这个解决方案,它很笨拙,对于大型应用程序来说可能会变得混乱(除非你有一个正确的系统)
总结
因为我们在评论中讨论了这些方法
你可以用自己的方式来做你想做的事,但你会遇到任何方法的各种问题。
如果我是你,我会重新设计我的应用程序,这样你想要实现的就不需要了。如果你不能那样做,唯一明智的方法就是不要在 parent 表单中使用这些控件,而是使用 always-maximized、non-closable MDI child 表单控件,并在每次需要在 MDI children 集合中工作时跳过 window。
这个问题让我很不舒服:)。经过大量测试,我无法真正找到解决方案。 BringToFront()
功能和 SendToBack()
均无法正常工作。也许以下方法可以帮助您。我使用 IntersectWith
Rectangle
Class 的函数并测试表单是否与 tabControl 相交。如果是,则将选项卡控件的可见性更改为 false,否则为 true。看看下面的代码:
先在mdi父窗体做窗体声明public:
public partial class MdiParentForm : Form
{
Form frm = new Form();
}
之后,当您初始化子表单时,向其 locationChanged
事件添加一些处理程序,如下所示:
frm.MdiParent = this;
frm.LocationChanged += Frm_LocationChanged;
frm.Show();
最后,这是处理程序:
private void Frm_LocationChanged(object sender, EventArgs e)
{
Rectangle tabControlRectangle = new Rectangle(tabControl1.Location, tabControl1.Size);
Rectangle childFormRectangle = new Rectangle(frm.Location, frm.Size);
if (tabControlRectangle.IntersectsWith(childFormRectangle))
{
tabControl1.Visible = false;
}
else
{
tabControl1.Visible = true;
}
}
感谢@Jcl,这个问题是只要子窗体的任何点接触到它的矩形,选项卡控件就会隐藏和显示。移动子表单会很糟糕 :-)
如何在我的父窗体中显示最顶部的按钮单击子窗体(带有作为填充停靠的 tabcontrol)? 它总是在父窗体的tabcontrol后面显示窗体,我什至用过:
frm.TopMost = true;
frm.BringToFront();
还在后面显示。
请说明您正在使用哪些框架的哪些组件以及您目前所做的工作。如果没有这些信息,我建议采用以下解决方案(未经测试)。
在您的 ParentForm 的 "ButtonClick" 事件中执行此操作:
ChildForm cf = new ChildForm();
cf.MdiParent = this;
cf.Show();
如果这不起作用,您可以添加一个
cf.Focus();
你想要的是不可能的。控件的 MDI children 显示在名为 MdiClient
的控件上(您不能直接 select),它不是 transparent(并且不能) 并且默认情况下,始终位于 parent 形式的其他控件的后面。
所以唯一的方法就是让 MdiClient
覆盖 parent 表单中的控件:这会达到您的预期,但它也会隐藏 parent 控制何时没有显示 child 表单(再一次,MdiClient
不是,也不能是 transparent)。
所以唯一合理的方法是使用 TabControl
最大化 child 形式,而不是直接在 parent.[=20 上使用 TabControl
=]
或者您可以让 TabControl
仅在没有 child windows 时显示。为此,以 parent 形式制作一个计时器,并在每个时间间隔检查一次:
if(MdiChildren.Length > 0)
myTabControl.SendToBack();
else
myTabControl.SendToFront();
这仅在 MDI children 始终最大化时才有效:当有任何 children 时,您的 TabControl
将不可见(无论它们是否覆盖它或不)
更新
如评论中所述,您可以 "your own MDI",方法是在 parent 表单中使用主机控件(例如 Panel
)并加载 [=56] =] 该控件中的表单:
var form = new ChildForm();
form.TopLevel = false;
form.Parent = myHostPanel;
form.Show();
这将在面板内显示表单(您可以在其中找到它并在您想要的位置进行 zorder)...但是您失去了所有 MDI 管理,并且您必须跟踪您的 child ren(并在需要时处理表单事件)自己。
我不会使用这个解决方案,它很笨拙,对于大型应用程序来说可能会变得混乱(除非你有一个正确的系统)
总结
因为我们在评论中讨论了这些方法
你可以用自己的方式来做你想做的事,但你会遇到任何方法的各种问题。
如果我是你,我会重新设计我的应用程序,这样你想要实现的就不需要了。如果你不能那样做,唯一明智的方法就是不要在 parent 表单中使用这些控件,而是使用 always-maximized、non-closable MDI child 表单控件,并在每次需要在 MDI children 集合中工作时跳过 window。
这个问题让我很不舒服:)。经过大量测试,我无法真正找到解决方案。 BringToFront()
功能和 SendToBack()
均无法正常工作。也许以下方法可以帮助您。我使用 IntersectWith
Rectangle
Class 的函数并测试表单是否与 tabControl 相交。如果是,则将选项卡控件的可见性更改为 false,否则为 true。看看下面的代码:
先在mdi父窗体做窗体声明public:
public partial class MdiParentForm : Form
{
Form frm = new Form();
}
之后,当您初始化子表单时,向其 locationChanged
事件添加一些处理程序,如下所示:
frm.MdiParent = this;
frm.LocationChanged += Frm_LocationChanged;
frm.Show();
最后,这是处理程序:
private void Frm_LocationChanged(object sender, EventArgs e)
{
Rectangle tabControlRectangle = new Rectangle(tabControl1.Location, tabControl1.Size);
Rectangle childFormRectangle = new Rectangle(frm.Location, frm.Size);
if (tabControlRectangle.IntersectsWith(childFormRectangle))
{
tabControl1.Visible = false;
}
else
{
tabControl1.Visible = true;
}
}
感谢@Jcl,这个问题是只要子窗体的任何点接触到它的矩形,选项卡控件就会隐藏和显示。移动子表单会很糟糕 :-)