【问题标题】:Modify a component property while the application is doing something else在应用程序执行其他操作时修改组件属性
【发布时间】:2021-07-05 10:13:21
【问题描述】:

我正在 C# 中设置我的第一步,我正在制作一个基于 System.Windows.Forms.Form 的小型应用程序,我在其上放置了一个简单的按钮。当单击此按钮时,我会做一些需要花费一些时间的事情,我想在操作发生时修改该按钮的Text 属性。

这就是我所做的(不要笑:-)):

        private void btn_STUFF_Click(object sender, EventArgs e)
        {
            string temp_Title = btn_STUFF.Text;
            btn_STUFF.Text = "Busy";
            this.Refresh();
            this.Update();
            this.Show();
            string temp = Do_Something_Which_Takes_Quite_Some_Time();
            txt_output.Text = temp;
            btn_STUFF.Text = temp_Title;
        }

尽管有Refresh()Update()Show(),但我没有看到我的按钮提到“忙碌”一词。

如何强制我的应用程序刷新表单上组件的属性(请尽可能简单)?

提前致谢

【问题讨论】:

标签: c# user-interface


【解决方案1】:

试试这个

private async void button3_Click(object sender, EventArgs e)
        {
            string currentText = button3.Text;

            button3.Invoke(new Action(() =>
            button3.Text = "Busy"
            ));

            //long running task
            await Task.Run(() => Task.Delay(5000));

            button3.Invoke(new Action(() =>
                button3.Text = currentText
                ));
        }

【讨论】:

    【解决方案2】:

    使用BackgroundWorker for WinForms(在System.ComponentModel里面),简单好用,

            private BackgroundWorker myWorker;
    
            public Form1()
            {
                InitializeComponent();
                myWorker = new BackgroundWorker();
                myWorker.DoWork += MyWorker_DoWork;
                myWorker.RunWorkerCompleted += MyWorker_RunWorkerCompleted;
            }
    
            private void MyWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                btnTest.Text = "Test";
                btnTest.Enabled = true;
            }
    
            private void MyWorker_DoWork(object sender, DoWorkEventArgs e)
            {
                ChangeControlPropThreadSafe(btnTest, () => btnTest.Text = "This button is busy!");
                ChangeControlPropThreadSafe(btnTest, () => btnTest.Enabled = false);
                Thread.Sleep(5000);
            }
    
            private void btnTest_Click(object sender, EventArgs e)
            {
                myWorker.RunWorkerAsync();
            }
            private void ChangeControlPropThreadSafe(Control control, MethodInvoker action)
            {
    
                if (control.InvokeRequired)
                {
                    control.Invoke(action);
                }
                else
                {
                    action();
                }
            }
    

    结果:

    【讨论】:

      猜你喜欢
      • 2021-11-25
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 2022-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多