c# WinForms:当父窗体被最小化时,如何防止子窗体被最小化?
本文关键字:最小化 窗体 何防止 WinForms | 更新日期: 2023-09-27 17:55:03
我正在创建一个c# WinForms MDI应用程序。我有一个主要形式,其中包含4个其他形式。我希望能够将子窗体移动到父窗体之外(它们的FormBorderStyle值设置为相当大的工具栏,以便单独的窗口不会出现在每个子窗口的任务栏上)。我可以通过对主表单使用以下代码来实现这一点:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Prototype
{
public partial class MdiParent : Form
{
private FastEyeControl m_ControlForm;
private FastEyeLogWindow m_LogForm;
private FastEyeConfiguration m_ConfigurationForm;
private ROCOrderWindow m_OrderLogForm;
public MdiParent()
{
InitializeComponent();
m_ControlForm = new FastEyeControl();
m_LogForm = new FastEyeLogWindow();
m_ConfigurationForm = new FastEyeConfiguration();
m_OrderLogForm = new ROCOrderWindow();
}
private void MdiParent_Load(object sender, EventArgs e)
{
m_ControlForm.Show(this);
m_LogForm.Show(this);
m_ConfigurationForm.Show(this);
m_OrderLogForm.Show(this);
}
}
}
然而,当我最小化父窗体时,所有子窗体也都会最小化(如预期的那样)。是否有办法防止父窗口外的任何子窗体在父窗口最小化时被最小化?基本上,我希望用户能够调整大小,并在需要时将各个子窗体移出父窗体(如在Visual Studio中取消工具栏)。. NET并将其放置在另一个监视器某处)。谢谢你的帮助!
我认为您将不得不远离拥有/父/mdi窗口,而将不得不使它们都是无主的顶层窗口,彼此"并行"。然后编写您自己的逻辑,用于将一个窗口停靠在另一个窗口中。
您实际上没有创建MDI应用程序,您没有设置子窗体的MdiParent属性。应该是清晰可见的,你可以把子窗体移到主窗体的边界之外。
您使用Show(owner)重载使它们拥有窗口。这意味着它们将始终在主窗口的顶部。当你最小化主窗口的时候也会最小化。
直接调用Show()方法(不带参数)
好的,我让它工作了:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace Prototype
{
public partial class MdiParent : Form
{
private FastEyeControl m_ControlForm;
private FastEyeLogWindow m_LogForm;
private FastEyeConfiguration m_ConfigurationForm;
private ROCOrderWindow m_OrderLogForm;
private Point m_ControlFormLocation;
private Point m_LogFormLocation;
private Point m_ConfigurationFormLocation;
private Point m_OrderLogFormLocation;
public MdiParent()
{
InitializeComponent();
m_ControlForm = new FastEyeControl();
m_LogForm = new FastEyeLogWindow();
m_ConfigurationForm = new FastEyeConfiguration();
m_OrderLogForm = new ROCOrderWindow();
m_ControlFormLocation = new Point(0, 25);
m_LogFormLocation = new Point(0, 405);
m_ConfigurationFormLocation = new Point(550, 25);
m_OrderLogFormLocation = new Point(0, 630);
}
private void MdiParent_Load(object sender, EventArgs e)
{
DockForm(m_ControlForm, m_ControlFormLocation);
DockForm(m_LogForm, m_LogFormLocation);
DockForm(m_ConfigurationForm, m_ConfigurationFormLocation);
DockForm(m_OrderLogForm, m_OrderLogFormLocation);
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
private void DockForm(Form form, Point location)
{
form.TopLevel = false;
form.Location = location;
if (! this.Controls.Contains(form))
{
this.Controls.Add(form);
}
form.Visible = true;
}
private void UndockForm(Form form)
{
if (this.Controls.Contains(form))
{
this.Controls.Remove(form);
}
form.TopLevel = true;
form.Visible = true;
}
private void DockOrUndockForm(Form form, Point location)
{
if (this.Controls.Contains(form))
{
UndockForm(form);
}
else
{
DockForm(form, location);
}
}
private void ToggleDockingOrDockForm(Form form, Point location)
{
if (form.Visible)
{
DockOrUndockForm(form, location);
}
else
{
DockForm(form, location);
}
}
private void fastEyeControlToolStripMenuItem_Click(object sender, EventArgs e)
{
ToggleDockingOrDockForm(m_ControlForm, m_ControlFormLocation);
}
private void fastEyeLogToolStripMenuItem_Click(object sender, EventArgs e)
{
ToggleDockingOrDockForm(m_LogForm, m_LogFormLocation);
}
private void fastEyeConfigurationToolStripMenuItem_Click(object sender, EventArgs e)
{
ToggleDockingOrDockForm(m_ConfigurationForm, m_ConfigurationFormLocation);
}
private void rOCOrderLogToolStripMenuItem_Click(object sender, EventArgs e)
{
ToggleDockingOrDockForm(m_OrderLogForm, m_OrderLogFormLocation);
}
}
}
这个代码安全吗?