2010-11-19 48 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); 
     } 
    }