WPF:

2010-11-19 23 views
0

numaralı ipi kullanarak tuvalde bir şey çizmek sorunum var 1 saniyede bir tuval üzerine bir resim çizmeye çalışıyorum. Sonra, uykudan 1 saniye sonra çekilecek yöntemi çağırmak için bir iş parçacığı yapıyorum. Sorun, Canvas nesnesinin çizilmesini istiyor. Programdan bana hata mesajıWPF:

Bu mesaja, başka bir iş parçacığı ait olduğu için erişilemiyor.

Kod

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

Nasıl çizmek için Thread Tuval erişilir?

+0

WPF ile bunu iş parçacığından yapmak için daha iyi yollar vardır; Gerektiği takdirde, Tuval üzerindeki Dispatcher'ı kullanın. – Pierreten

+0

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

+0

@Pierreten: Sanırım bunu bir cevap, bu yüzden kabul ve oylanabilir. – Jens

cevap

3

DispatcherTimer sınıfına bir göz atın. MSDN örneklerinde görüldüğü gibi, tam olarak bu senaryo için tasarlanmıştır.

0

Grafik nesneleri, oluşturduklarından farklı bir iş parçacığına erişemezsiniz.

2

Sen

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

(I this bazı UI kontrolü olduğunu varsayıyorum. Değil bunun yerine Application.Current.Dispatcher kullanabiliyorsa) çağırabilir. Tuval işlemlerinizi UI iş parçacığında yürütür.

+0

Çözümünüz için teşekkür ederiz –

1

DispatcherTimer'i denedim, iş var.

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