2008-09-15 62 views
9

短版本:我想触发Form_Load()事件而不使表单可见。这不起作用,因为展()忽略的Visible属性的当前值:加载表单时不显示它

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

龙版本:我有两种形式WinForms应用程序:主要任务。主窗体始终显示。用户可以单击按钮打开任务表单,也可以单击一些只需直接运行任务而不打开任务表单的按钮。

当用户要求直接运行任务时,我想只在任务表单上调用一些公共方法而不显示它。不幸的是,任务逻辑取决于Form_Load()事件中发生的事情。我可以找到触发Form_Load()的唯一方法是调用Show()。我已经能够做的最好的是展现形式在最小化状态:

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

我想最干净的解决办法是拉的任务逻辑所担负的任务形式,并成为一个控制器类。然后我可以从主窗体和任务窗体中使用该类,并且只在需要用户可见时才加载任务窗体。但是,如果加载表单并不显示它是一件容易的事情,那将是一个较小的改变。

+0

我鼓励你使用最干净的解决方案。稍后维护会更容易。 – 2008-09-15 21:06:11

+0

正如我在答复中所说的,我赞同Scott的观点,你需要重做这个并且去控制器类的路线。这是很好的做法。 – 2008-09-15 21:13:15

回答

7

我完全同意Rich B,你需要看看你在哪里放置你的应用程序逻辑,而不是试图弄乱WinForms机制。您的任务表单所公开的所有这些操作和数据应该在单独的类中说明某种应用程序控制器或您的主表单所持有的内容,然后由您的任务表单在需要时用于读取和显示数据,但不会需要一个被实例化的表单才能存在。

这可能似乎是一个痛苦的返工,但你会提高应用程序的结构,使其更易于维护等

9

这听起来像你需要坐下来重新考虑你的方法在这里。我无法想象你的公共方法需要以某种形式出现的唯一原因,如果你不打算展示它的话。只要创建一个新班级。

+0

为了推断您的观点,请为任务提供Model类,并为TaskForm提供View/Controller类。 – user7116 2008-09-15 21:08:09

+0

@sixlettervariables:为什么他需要一个视图?他说他无论如何都不会加载这个表格。听起来他只是需要一堂课。 – GEOCHET 2008-09-15 21:09:40

0

如果您公开该方法,那么您可以直接访问它....但是,当您调用它时可能会出现一些意想不到的副作用。但公开并直接调用它不会画出屏幕或打开表单。

0

将表单类的强制初始化代码从Load事件处理程序移出到构造函数中。对于一个Form类来说,一个实例的实例化(通过构造函数),表单加载和表单可见性是三件不同的事情,并不需要同时发生(尽管它们显然需要按照该顺序发生)。

4

从MSDN:

Form.Load
在首次显示表单之前发生。

含义唯一会导致窗体加载的是它的显示时间。
Form.Show();Form.Visible = true;是完全一样的东西。基本上,在幕后,Show检查各种条件,然后将Visible设置为true。很明显,在显示表单之前将可见设置为false(它已经是)是毫无意义的。

但让我们忘记技术问题。我完全同意Rich B和Shaun Austin--不管怎样,逻辑不应该是这样。

11

也许这里应该指出,你可以在可以导致窗体的窗口被创建而不显示窗体。我认为想要这样做可能有合理的情况。

无论如何,好的设计或没有,你可以是这样做的:

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

我不认为这会造成的Form_Load()被调用,但你将能够调用f.Invoke ()在这一点上(当我偶然发现这个问题时,这就是我正在做的事情)。

1

有时候这样做会很有用,而且不会成为不好的设计。有时它可能是从本地迁移到托管的开始。

如果您正在将C++应用程序迁移到.NET,您可以简单地将您的应用程序作为.NET窗体或面板的子窗口,然后逐渐迁移到.NET,方法是删除您的C++应用程序菜单,状态栏,工具栏和映射使用平台调用等应用程序到您的应用程序...

您的C++应用程序可能需要一段时间才能加载,但.NET窗体doesn't ..您可能会喜欢隐藏.NEt表单,直到你的C++应用程序初始化自己。

在调用show之后,我将opacity = 0和visible = false设置为false,然后当您的C++应用程序加载时,然后反转。