我试图在模态形式最小化时使所有者形式最小化。但是当我最小化模态形式时 - 它完全消失了。 ( - 我可以点击所有者表格。)
我该如何解决这个问题?
我有:
public partial class Form1 : Form
{
Form2 frm2 = new Form2();
public Form1()
{
InitializeComponent();
frm2.Owner = this;
}
private void button1_Click(object sender, EventArgs e)
{
frm2.ShowDialog();
}
}
和
class Form2 : Form
{
Form1 frm1;
FormWindowState ws = new FormWindowState();
public Form2()
{
SizeChanged += new EventHandler(Form2_SizeChanged);
}
void Form2_SizeChanged(object sender, EventArgs e)
{
frm1 = (Form1)Owner;
if (WindowState == FormWindowState.Minimized)
{
ws = frm1.WindowState;
frm1.WindowState = FormWindowState.Minimized;
}
else frm1.WindowState = ws;
}
}
(尝试这个时,我也碰到了这个:Modal form doesn't appear in tray until minimized and owner-form is clicked once. How do I make it appear?)
答案 0 :(得分:3)
这是设计的。作为模态合同的一部分,显示一个对话框会禁用应用程序中的所有其他窗口。当用户最小化对话窗口时,没有用户可以访问的窗口。使应用程序无法使用。 Winforms确保在最小化时自动关闭对话框不会发生这种情况。
显然,你想要防止这种情况发生。将MinimizeBox属性设置为false。 MaximizeBox属性也应该设置为false,使两个按钮从窗口标题中消失。为HelpButton btw留出空间。
答案 1 :(得分:1)
我不记得每个需要这么多代码才能让模态Windows工作。我很担心你的评论“我可以点击所有者表格”,这让我相信表格没有被正确设置为模态。通过定义,必须在用户控制返回所有者表单之前处理模态表单。 Minimizinfg模态形式并不构成对模态形式的正确“处理”。
以下是我过去使用的一些代码。注意:在ShowDialog中将所有者作为参数传递可建立所有权关系。虽然我怀疑你的代码是有效的,但我并没有这样使用它。
另外,当我这样做时,我没有在模态窗体中放置任何特殊代码,并且还禁用了窗体右上角的所有按钮;从而确保用户无法在我提供的任何按钮之外关闭,最小化或最大化模态形式。
public partial class Form1 : Form
{
Form2 frm2 = new Form2();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
frm2.ShowDialog(this);
}
}
我希望这会有所帮助。
答案 2 :(得分:0)
表单具有属性ShowInTaskbar
。如果设置为false
,则表单将永远不会出现在任务栏上,即使最小化也是如此。
答案 3 :(得分:0)
添加:
Show();
在Form2的事件处理程序结束时。
答案 4 :(得分:0)
我还有一个要求,即在最小化对话框形式时它应该最小化应用程序,并且在恢复应用程序时它应该再次显示对话框。这就是我的所作所为:
MainForm.cs
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2.Show(this, "Testing 123");
}
}
Form2.cs
public partial class Form2 : Form
{
bool isMinimized;
private Form2()
{
InitializeComponent();
ShowInTaskbar = false;
}
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
if (Owner != null)
{
Owner.Enabled = true;
}
}
private void Form2_Load(object sender, EventArgs e)
{
MinimizeBox = Owner != null;
if (Owner != null)
{
Owner.Enabled = false;
}
}
private void Form2_SizeChanged(object sender, EventArgs e)
{
if (Owner != null)
{
if (WindowState == FormWindowState.Minimized && Owner.WindowState != FormWindowState.Minimized)
{
Owner.Enabled = true;
Owner.WindowState = FormWindowState.Minimized;
isMinimized = true;
}
else if (isMinimized && Owner.WindowState != FormWindowState.Minimized)
{
Owner.Enabled = false;
}
}
}
public static void Show(Form owner, string message)
{
var form2 = new Form2();
form2.label1.Text = message;
if (owner != null)
form2.Show(owner);
else
form2.ShowDialog();
}
}