2013-06-25 144 views
0

我正在嘗試爲我現有的多圖紙的重畫功能生成一個線程。我在這裏讀到這是可能的UI可以實現線程看到這裏LINK,但我不能用它在我的redrawSingelPoly()函數....任何想法如何我可以使用redrawSingelPoly()作爲線程?帶UI的線程(畫布)

在我MainWindow.xaml.cs:

正所謂,當用戶按下我的主窗口上的按鈕:

private void SingleSelectedMeasurement(object sender, RoutedEventArgs e) 
    { 
     System.Windows.Controls.Button button = (System.Windows.Controls.Button)sender; 
     RedrawSingelMeasurement(Convert.ToInt16(button.Tag)); 
    } 

    private void RedrawSingelMeasurement(int selectedMeasurement) 
    { 
     selectedMeasurement = selectedMeasurement - 1; 

     for (int i = 0; i < measurements.Length; i++) 
     { 
      if (selectedMeasurement != i) 
      { 
       measurements[i].draw = false; //block drawing 
      } 
      else 
      { 
       measurements[i].draw = true; // remove block for drawing 
      } 
     } 
      measurements[selectedMeasurement].redrawSingelPoly(); 
    } 

在我Measurement.cs:

public void redrawSingelPoly() 
    { 
     Polyline poly = new Polyline(); 
     poly.Stroke = colorBrush; 
     poly.StrokeThickness = basicLineThick; 

     //first clean all 
     coordinateSystem.Children.Clear(); 

     poly.Points = points; 
     //draw 
     coordinateSystem.Children.Add(poly); 
    } 
+1

將該方法包裝在一個「Action」委託中,並將其傳遞給UI調度程序。 – PoweredByOrange

回答

0

你不能從與其相關的線程訪問DependencyObject的DependencyProperties(在您的情況下:coordinateSystem)。

如果你想加快你的應用程序,你應該創建自定義控件,重寫它的OnRender方法並在那裏繪製自定義圖形:它將刪除大量的邏輯和可視樹邏輯,並且工作速度會快很多。

0

你所提到的就是實際上只是具有每個窗口一個線程會談的文章。在不同的線程中繪製專用元素是不可能的。

0
private void SingleSelectedMeasurement(object sender, RoutedEventArgs e) 
{ 
    var button = (System.Windows.Controls.Button)sender; 

    Task.Factory.StartNew (
     () => OnUi(RedrawSingelMeasurement(Convert.ToInt16(button.Tag))));   
} 

//here's a sample on how to get despatcher for the ui thread 
private void OnUi (Action action) 
    { 
     if (_dispatchService == null) 
      _dispatchService = ServiceLocator.Current.GetInstance<IDispatchService>(); 
      //or _dispatchService = Application.Current.Dispatcher - whatever is suitable 

     if (_dispatchService.CheckAccess()) 
      action.Invoke(); 
     else 
      _dispatchService.Invoke(action); 
    } 
+0

我如何聲明_dispatchService? – user2261524