2013-06-25 66 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