C#窗体:在线程运行时选择性禁用UI

本文关键字:选择性 UI 运行时 线程 窗体 | 更新日期: 2023-09-27 18:21:17

我有一个非常复杂的表单,它提供了运行脚本(我们自己的类型)的选项。当它运行时,我不想完全锁定UI,所以我想在线程中启动它。到目前为止还不错,但为了防止用户搞砸事情,我需要选择性地禁用部分UI。我可以递归地设置Enabled=false,然后在线程结束时设置Enabled=true。但这忽略了运行时控件的状态(即由于各种原因禁用的控件将被错误地重新启用)。除了构建布尔树之外,还有其他阻止输入的方法吗(比如Java中的GlassPane类型)?

C#窗体:在线程运行时选择性禁用UI

不要使用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