当前位置:  开发笔记 > 编程语言 > 正文

加载表单而不显示它

如何解决《加载表单而不显示它》经验,为你挑选了4个好方法。

简短版本:我想触发Form_Load()事件而不使表单可见.这不起作用,因为Show()忽略Visible属性的当前值:

tasksForm.Visible = false;
tasksForm.Show();

长版本:我有一个WinForms应用程序有两种形式:main和tasks.始终显示主窗体.用户可以单击按钮打开任务表单,也可以单击某些按钮直接运行任务而无需打开任务表单.

当用户要求直接运行任务时,我想在任务表单上调用一些公共方法而不显示它.不幸的是,任务逻辑依赖于Form_Load()事件中发生的事情.我能找到触发Form_Load()的唯一方法是调用Show().我能做的最好的事情是在最小化状态下显示表单:

tasksForm.WindowState = FormWindowState.Minimized;
tasksForm.Show();

我认为最干净的解决方案是将任务逻辑从任务表单中拉出来并转换为控制器类.然后我可以从主窗体和任务窗体中使用该类,并且只在我需要用户可见时才加载任务窗体.但是,如果加载表单而不显示它是一件容易的事情,那将是一个较小的变化.



1> Jeff Roe..:

也许在这里应该注意,您可以在不显示表单的情况下创建表单窗口.我认为可能有合法的情况想要这样做.

无论如何,好的设计与否,你可以这样做:

MyForm f = new MyForm();
IntPtr dummy = f.Handle; // forces the form Control to be created

我不认为这会导致调用Form_Load(),但是你可以在这一点上调用f.Invoke()(当我偶然发现这个问题时,我正试图这样做).



2> GEOCHET..:

听起来像你需要坐下来重新思考你的方法.如果你不打算展示它,我无法想象你的公共方法需要在一个表单中的一个原因.做一个新课.



3> Shaun Austin..:

我完全同意Rich B,您需要查看放置应用程序逻辑的位置,而不是尝试使用WinForms机制.您的任务表单公开的所有这些操作和数据应该在一个单独的类中,说某种应用程序控制器或您的主表单所持有的东西,然后由您的任务表单用于在需要时读取和显示数据但不是需要一个表格来实例化存在.

重做它可能看起来很痛苦,但是你将改进应用程序的结构并使其更易于维护等.



4> configurator..:

来自MSDN:

Form.Load
在第一次显示表单之前发生.

这意味着唯一会导致表单加载的是它何时被显示.
Form.Show();并且Form.Visible = true;是完全相同的事情.基本上,在幕后,Show会检查各种条件,然后将Visible设置为true.很明显,在显示表单之前将visible设置为false(它已经是)是没有意义的.

但是让我们忘记技术细节.我完全赞同Rich B和Shaun Austin - 无论如何,逻辑不应该是那种形式.

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有