C#窗体:在线程运行时选择性禁用UI
本文关键字:选择性 UI 运行时 线程 窗体 | 更新日期: 2023-09-27 18:21:17
我有一个非常复杂的表单,它提供了运行脚本(我们自己的类型)的选项。当它运行时,我不想完全锁定UI,所以我想在线程中启动它。到目前为止还不错,但为了防止用户搞砸事情,我需要选择性地禁用部分UI。我可以递归地设置Enabled=false,然后在线程结束时设置Enabled=true。但这忽略了运行时控件的状态(即由于各种原因禁用的控件将被错误地重新启用)。除了构建布尔树之外,还有其他阻止输入的方法吗(比如Java中的GlassPane类型)?
不要使用DoEvents
,它是邪恶的。
使用面板并在其中添加要禁用的所有控件。当面板将被禁用时,所有内部控件将显示为已禁用,但其Enabled
属性的值实际上不会被修改。
下面是一个工作示例:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// Disables UI elements using the panel
this.SetPanelEnabledProperty(false);
// Starts the background work
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(this.Worker));
}
private void Worker(object state)
{
// Simulates some work
System.Threading.Thread.Sleep(2000);
// Now the work is done, enable the panel
this.SetPanelEnabledProperty(true);
}
private void SetPanelEnabledProperty(bool isEnabled)
{
// InvokeRequired is used to manage the case the UI is modified
// from another thread that the UI thread
if (this.panel1.InvokeRequired)
{
this.panel1.Invoke(new MethodInvoker(() => this.SetPanelEnabledProperty(isEnabled)));
}
else
{
this.panel1.Enabled = isEnabled;
}
}
}
是否可以在脚本运行时使用一个填充了要禁用的控件的面板,然后在脚本结束时重新启用该面板。
或者,您可以启动脚本的进程。
您可以使用Application.DoEvents()方法来解决此问题,或者您必须编写一个调用corosponding控件的委托。我认为Application.DoEvents()将是最简单的方法。您应该在线程的循环中调用Application.DoEvents()。
对于委托版本,您可以在此处找到一些信息:http://msdn.microsoft.com/de-de/library/zyzhdc6b.aspx