如何在每次迭代后更新GUI?

时间:2012-03-05 13:42:57

标签: c# wpf user-interface dispatcher

我有一个代表坐标系的标签和画布。在画布中有一个节点,每次进行计算时都应该更改它的位置。这样做直到达到特定的停止标准。

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

我看过调度员,但我的GUI只会在计算完成后更新。以下是我尝试使用Dispatcher作为标签。

While(notDone = true){
//Calculations made here

Application.Current.Dispatcher.BeginInvoke(
                    DispatcherPriority.Background,
                    new Action(() => this.aLabel.Text = aString ));
}

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

4 个答案:

答案 0 :(得分:1)

.Net有一个完全适合你的课程,我的朋友!

BackgroundWorker

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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++;
        }
    }

不要忘记停止线程:)

答案 3 :(得分:0)

如果您使用WPF / Silverlight make类实现INotifyPropertyChanged并将元素位置绑定到属性。在RaisePropertyChanged(“PropName”)位置'将被更改。