【发布时间】:2011-08-24 02:24:27
【问题描述】:
我有一个强大的命名程序集。
以前有人问过这个问题……但只是出于不同的目的。
我有一个 Form 基类。当实现类在基类IsBusy 上设置属性时。我想阻止与表单的所有交互(设置 Enabled = false 是不够的 - 我还想阻止移动、调整大小、关闭等......并且我不希望我的控件在 IsBusy == true 时看起来被禁用)并在前面显示一个弹出式加载表单(带有加载动画的透明、无边框表单)。
在我的加载动画表单上调用 ShowDialog 可以阻止调用表单上的交互...但显然我还希望调用表单代码继续执行。
现在我正在使用 new LoadingForm().Show(),然后在我的调用 Form 上处理 WndProc,如果 IsBusy == true 我抑制所有 WndProc 消息......但我不喜欢这种方法。它也可以防止表单重新绘制,这是我不想要的。
如果我知道在IsBusy == true...时允许正确重绘的所有不同类型的消息,我不会那么介意 WndProc 方法。
所以,我的问题是:
有没有更好的解决方案?
或
谁能告诉我应该让哪些 WndProc 消息通过?或者在哪里可以找到词汇表?
谢谢。
【问题讨论】:
-
“显然我也希望调用表单线程继续执行” - 只是不做任何事情,它会。看起来您正在解决一个不存在的问题。
-
一种方法是启动一个新线程来运行操作(不是原始 UI 线程)并让该线程完成关闭“忙碌”对话框(通过调用),以便消息泵将控制恢复为原始形式。对此的一种标准封装是使用 BackgroundWorker。
-
你是对的,使用 BackgroundWorder 可以解决这个问题。但我想集中进行此更改...而且我知道有些地方不使用 BackgroundWorker,这会使这些地方在此更改后无法正常工作。