2010-11-19 63 views
0

我尝试在画布上每1秒绘制一些东西。然后,创建一个线程调用睡眠1秒后绘制的方法。问题在于调用Canvas对象进行绘制。该程序告诉我错误消息WPF:我在使用线程绘制画布上的东西时出现问题

调用线程不能访问此对象,因为不同的线程拥有它。

代码

private void drawTimeTick() { 
     ... 
     Thread iThread = new Thread(new ThreadStart(tickThread)); 
     iThread.Start(); 
    } 
    private void tickThread(){ 
     try 
     { 
      Thread.Sleep(1000); 
      ... 
      Canvas.SetLeft(tick, 700); 
      Canvas.SetTop(tick, 30); 
     }catch(Exception ex){ 
      MessageBox.Show("Exception tickThread : "+ex.Message); 
     } 
    } 

如何访问画布的主题画?

+0

有wayyyyy与WPF做比较线程的更好的方法;如果你一定要使用画布上的Dispatcher – Pierreten 2010-11-19 08:49:33

+0

http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.invoke.aspx – Pierreten 2010-11-19 08:51:58

+0

@Pierreten:我想你应该把它作为一个答案,所以它可以被接受和投票。 – Jens 2010-11-19 08:56:09

回答

3

看看DispatcherTimer课程。它正是为这种情况而设计的,正如MSDN示例中所见。

0

您不能从创建它的不同线程访问图形对象。

2

您可以拨打

this.Dispatcher.Invoke((Action)(() => 
            { 
             Canvas.SetLeft(tick, 700); 
             Canvas.SetTop(tick, 30); 
            })); 

(我假设this是一些用户界面的控制。如果不是你可以使用Application.Current.Dispatcher代替)。它将在UI线程上执行您的画布操作。

+0

谢谢你的解决方案 – 2010-11-19 10:18:34

1

我试过DispatcherTimer,这是工作。

DispatcherTimer timer = new DispatcherTimer(); 
     timer.Interval = TimeSpan.FromSeconds(1); 
     timer.Tick += tickThread; 
     timer.Start(); 
    } 
    private void tickThread(object sender, EventArgs e) 
    { 
     try 
     { 
      tick.thisTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second); 
      double TickPixel = GetPixel(ClassTimeline.Width, startTime, endTime, tick.thisTime); 
      Canvas.SetLeft(tick, TickPixel); 
      Canvas.SetTop(tick, 30); 
     }catch(Exception ex){ 
      MessageBox.Show("Exception tickThread : "+ex.Message); 
     } 
    }