2010-11-19 4 views
0

Ich versuche, etwas auf der Leinwand alle 1 Sekunde zu zeichnen. Dann erstelle ich einen Thread eine Methode zum Zeichnen nach dem Schlaf 1 Sekunde aufrufen. Das Problem besteht darin, das zu zeichnende Canvas-Objekt aufzurufen. Das Programm sagt mir FehlermeldungWPF: Ich habe ein Problem beim Zeichnen etwas auf der Leinwand mit Thread

Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, weil ein anderer Thread es besitzt.

-Code

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

Wie Leinwand in Thread zugreifen zu ziehen?

+0

Es gibt wayyyyy bessere Möglichkeiten, dies mit WPF als Threading zu tun; Wenn Sie jedoch müssen, verwenden Sie den Dispatcher auf dem Canvas – Pierreten

+0

http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.invoke.aspx – Pierreten

+0

@Pierreten: Ich denke, Sie sollten dies als post eine Antwort, damit sie angenommen und abgestimmt werden kann. – Jens

Antwort

3

Werfen Sie einen Blick auf die DispatcherTimer Klasse. Es ist genau für dieses Szenario konzipiert, wie in den MSDN-Beispielen zu sehen ist.

0

Sie können nicht auf grafische Objekte von einem anderen Thread als denen, die sie erstellt haben, zugreifen.

2

können Sie rufen

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

(Ich gehe davon aus, dass this einige UI-Steuerelement ist. Wenn nicht, können Sie Application.Current.Dispatcher stattdessen verwenden). Es führt Ihre Arbeitsumgebungen auf dem UI-Thread aus.

+0

Vielen Dank für Ihre Lösung –

1

Ich habe versucht DispatcherTimer, es ist Arbeit.

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); 
     } 
    } 
Verwandte Themen