如何在每次迭代后更新GUI

本文关键字:更新 GUI 迭代 | 更新日期: 2023-09-27 18:26:49

我有一个表示坐标系的标签和画布。画布中有一个节点,每次进行计算时都会更改其位置。直到满足特定的停止标准为止。

我还有一个标签,其中包含笔记的坐标信息。我希望能够在每次迭代中(每次进行计算时)看到节点和标签的更新。

我已经查看了调度器,但我的GUI只有在计算完成后才会更新。以下是我尝试使用标签的Dispatcher所做的操作。

While(notDone = true){
//Calculations made here
Application.Current.Dispatcher.BeginInvoke(
                    DispatcherPriority.Background,
                    new Action(() => this.aLabel.Text = aString ));
}

我一直在寻找类似问题的解决方案,有些解决方案涉及线程。我必须使用线程来更新GUI吗?

如何在每次迭代后更新GUI

.Net有一个适合你的类,我的朋友!

后台工作人员

在DoWork方法中完成所有繁重的工作(循环),并在ReportProgress中更新GUI。请参阅文档以获取帮助。

只需创建用于处理信息更改的委托和事件

public delegate void SomeInfoChangeDelegate(object o);
public event SomeInfoChangeDelegate InfoChangeEvent = null;

将侦听器分配给事件并启动线程w/计算

InfoChangeEvent += new SomeInfoChangeDelegate(OnInfoChanged);
Thread t = new Thread(new ParameterizedThreadStart(SomeWorkerThread));
t.Start();

使计算线程和事件侦听器

    void OnInfoChanged(object o)
    {
        // Update label
    }
    protected void SomeWorkerThread(object o)
    {
        int i = 0;
        while(true)
        {
            if( i % 10 == 0 )
            {
                if(InfoChangeEvent != null)
                {
                    InfoChangeEvent(i);
                }
            }
            Thread.Sleep(1000);
            i++;
        }
    }

不要忘记停止线程:)

如果您在UI(主)线程中执行计算,则在完成消息之前,它无法处理消息。将计算移动到另一个线程,并在每次迭代中通知主线程。

如果使用WPF/Silverlight,请实现具有INotifyPropertyChanged的类,并将元素位置绑定到属性。在RaisePropertyChanged("PropName")上,位置将被更改。