我有一个代表坐标系的标签和画布。在画布中有一个节点,每次进行计算时都应该更改它的位置。这样做直到达到特定的停止标准。
我还有一个包含音符坐标信息的标签。我希望能够在每次迭代时看到节点和标签更新(每次进行计算时)。
我看过调度员,但我的GUI只会在计算完成后更新。以下是我尝试使用Dispatcher作为标签。
While(notDone = true){
//Calculations made here
Application.Current.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new Action(() => this.aLabel.Text = aString ));
}
我一直在寻找类似问题的解决方案,而一些解决方案涉及线程。我是否必须使用线程来更新我的GUI?
答案 0 :(得分:1)
答案 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”)位置'将被更改。