c# - 3 窗体 Show 和 ShowDialog 没有按预期工作,BUG?

标签 c# .net visual-studio winforms forms

我正在使用 Visual Studio 2010、C# .NET 4.0。我有 3 个表单:Form1、Form2、Form3。

在 Form1 中我有一个打开 Form2 的按钮:

private void button1_Click(object sender, EventArgs e)
{
    Form2 f = new Form2();
    f.Show();
}

在 Form2 中,我有一个私有(private)的 Form3 变量,它总是指向同一个 Form3:

private Form3 f = new Form3();

还有一个将其作为对话框打开的按钮:

private void button1_Click(object sender, EventArgs e)
{
    f.ShowDialog();
}

在 Form3 中我只有一个按钮来隐藏表单:

private void button1_Click(object sender, EventArgs e)
{
    this.Hide();
}

问题是在Form2在Form1前面,Form3在Form2前面的情况下,当我点击Form3的按钮隐藏它时,它不仅隐藏了自己,而且将Form1发送到所有Form的后面其他窗口。

只有当 Form1 的后台有另一个程序(如 Windows Explorer)的窗口时才会出现这种情况。这似乎是一个错误。你怎么看?

最佳答案

是的,这在设计上无法正常工作。对话框会禁用您的程序显示的所有窗口。所以它是模态的。当您隐藏对话框时,没有留下可以获取焦点的窗口。 Windows 被迫寻找另一个窗口以提供焦点。那将是另一个应用程序拥有的窗口。您自己的窗口现在将隐藏在它后面。

副作用比较多,对话框也会关闭。必要的,因为否则用户将永远无法返回到您的程序,因为所有窗口都被禁用。这都是意料之中的行为。 Bug 是一个很重的词,但如果它在关闭对话框之前首先重新启用所有窗口,它当然会更好。但是关闭对话框已经是不受欢迎的行为。

不要为对话框调用 Hide()。只需将 DialogResult 属性设置为 DialogResult.Cancel 即可获得完全相同的效果,但不会出现焦点问题。如果你想再次显示对话框,你必须将它重置回无。这是一个真正的错误。

关于c# - 3 窗体 Show 和 ShowDialog 没有按预期工作,BUG?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3742819/

相关文章:

c# - 我最终可以从 MAUI 获得 .AAB 文件格式吗?

c# - 连接两个元素交错的序列

c# - 在哪里处理 Task 抛出的异常

c# - Microsoft visual studio 2013 is busy 错误

c++ - Igraph 特征向量中心性运行时错误 c++

c# - .net 中的 TLS/SSL

c# - 模拟鼠标移动

c# - 从给定的 JSON 文件中检索特定属性

reactjs - 在没有 ASP.NET Core 的 Visual Studio 中使用react

c# - 如何在 .NET 6 类库中初始化 ILogger?