【发布时间】:2016-02-28 16:16:49
【问题描述】:
我有一个 winforms 单表单应用程序,它使用我在将新视图加载到应用程序表单时创建的“Thickbox”。
“Thickbox”在应用程序表单前面显示了另一个表单,它是半透明的,并且有一个用户控件,即盒子本身。
这个thickbox可以显示一个模态对话框,在这种情况下我完全没有问题,但它也可以显示为非模态,例如,当用户在主窗体中切换视图时,它会显示thickbox加载动画图标。
问题是当厚框显示为非模式时,它不会阻止用户点击应用程序主窗体的按钮。
当显示thickbox 时,没有任何反应,但一旦关闭,主窗体中相关按钮的单击事件处理程序就会处理单击。
我无法使用ShowDialog,因为我无法阻止 UI 线程,并且我需要从主窗体中获取何时关闭厚框的指示,
我无法设置所有者表单 as described in this answer 的 Enabled 属性(尽管我尝试了此解决方案的各种版本,但没有任何帮助)
我试过使用win API函数BlockInputas descried in this answer,但是没有阻塞输入,
我认为我最好的机会是使用Application.FilterMessage 方法,但我也无法阻止鼠标点击。
如果我可以将鼠标点击阻塞封装在厚框表单本身中,那就太好了,这样它也可以很容易地与其他应用程序一起使用,但是 对调用表单的解决方案也将非常感激。
【问题讨论】:
-
等等,为什么不能设置所有者表单的
Enabled属性?这将是我阅读问题后的建议,并且您不会在这里解释为什么它不起作用。这本质上就是模态对话框正在做的事情,并且应该正是您想要的行为。 -
@CodyGray:这也是我最初的尝试,我确实尝试过这样做,但在我的情况下,这个选项有两个问题:第一个是它延迟了加载的出现图标,第二个是它改变了我在主窗体中的大多数按钮的颜色,并且在关闭厚框后没有足够快地改变它们。我尝试在 form_shown 中,在 userControl 的加载中,甚至在 userControl 的绘制事件中,但没有什么是足够好的......
-
我不知道为什么会延迟图标的出现。如果没有看到您的代码,我什至不确定这意味着什么。我的猜测是禁用表单会停止加载代码。至于更改按钮的颜色,这是有道理的,因为它会禁用这些按钮,并且禁用的按钮显然看起来不同。如果您在关闭弹出对话框之前重新启用父窗体,则按钮应在弹出对话框关闭时更新。如果没有,您可以通过使表单无效来强制他们重新绘制自己。所以这两个都是代码排序问题。
-
@CodyGray 相信我,我也尝试过...我什至尝试使用异步任务,但似乎没有什么能做得足够好...
-
真正疯狂的部分是,我现在尝试用新的 winforms 应用程序复制该问题,而且新应用程序似乎工作正常。
标签: c# winforms mouseclick-event