如果已经打开,专注于Winform?

4

如果表单已经打开,我需要将焦点放在表单上;否则,我想要打开新的表单。

我尝试了以下代码来解决我的问题,但它会打开一个新的表单而不是将焦点放在已经打开的表单上。

foreach (var item in Application.OpenForms)
        {
            Form form1 = item as Form ;
            if (form1 != null)
            {
                form1.Activate();
                break;
            }
            else
            {
                form1 = new Form ();
                form1.Show();
                break;
            }

        }

“但是不起作用”并没有告诉我们它是如何“不起作用”的任何信息。此外,您真的想要所有由“此应用程序”拥有的表单吗?而且是“任何”表单而不是特定类型的表单吗?为什么您只创建一个新的“Form”,而不是一些自定义表单呢? - Jon Skeet
以上代码针对此问题,每次打开新表单而不是专注于已经存在的表单。 - Michael S. Willy
@MichaelS.Willy:你尝试过哪些调试方法?你是否看到Application.OpenForms实际返回了任何窗体?你是对此应用程序拥有的窗体感兴趣,还是对当前用户会话中的所有窗口感兴趣? - Jon Skeet
1个回答

8

我猜测问题在于您只查看了第一个表单 - 您在if语句的两个部分中都使用了break语句...并且您只是使用了通用的Form类型,这几乎肯定是不合适的。您可能需要使用以下内容:

var form = Application.OpenForms.OfType<MyForm>().FirstOrDefault();
if (form != null)
{
    form.Activate();
}
else
{
    new MyForm().Show();
}

如果我尝试打开已经打开的新表单,我想在我的应用程序中集中任何形式。 - Michael S. Willy
@MichaelS.Willy:好的,哪个线程正在运行这段代码?如果您没有打开任何窗体,该进程是否仍然存在?或者您是实际上启动了一个新进程,并尝试在另一个进程中查找窗体?因为那是完全不同的问题。 - Jon Skeet
仅限于此进程,不允许启动其他进程。请勿进行其他处理。 - Michael S. Willy
现在我可以做到了。感谢您在我的问题上花费宝贵的时间,这真的帮了我很多。 - Michael S. Willy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接