2017-01-12 45 views
0

我有一个在类中声明的整型数组。使用该数组,PolyLine在网格上绘制。数组的元素是y坐标。数组必须不断更新,然后才能显示值。我实现这个想法是有两个线程。一个用于更新数组的值,另一个用于在网格上打印PolyLine。 更新阵列不是问题。当我尝试使用下面的代码在网格上打印PolyLine时,将引发一个异常,并显示以下消息:“调用线程无法访问此对象,因为不同的线程拥有它。” 请建议使用线程解决此问题的解决方法。也许,一个事件可能被用来代替线程?我乐于接受建议。任何帮助表示赞赏!控制WPF元素

public partial class MainWindow : Window 
{ 
    Polyline Wave = new Polyline(); 
    public MainWindow() 
    { 
     InitializeComponent(); 
     Refresh(); 
     DisplyOnGrid(); 
     ThreadStart child = new ThreadStart(DisplyOnGrid); 
     Thread _DisplayOnGrid = new Thread(child); 
     _DisplayOnGrid.Priority = ThreadPriority.Highest; 
     _DisplayOnGrid.Start(); 
    } 

    private void DisplyOnGrid() 
    { 
     Wave.Stroke = Brushes.Yellow; 
     Wave.StrokeThickness = 1.25; 
     for (int i = 0; i < DisplayGrid.Width; i++) 
     { 
      Wave.Points.Add(new Point(i, 50)); 
     } 
     DisplayGrid.Children.Add(Wave); 
    } 

    private void Refresh() 
    { 
     DisplayGrid.Children.Clear(); 
    } 
} 
+0

为什么你从电网移除折线,然后添加它又是什么?你可以改为简单地替换它的'Points'集合。除此之外,您应该按照答案中所示使用分派器,或者根本不使用线程,而使用DispatcherTimer。 – Clemens

回答

2

你得到错误,因为你正在试图访问这是由UI拥有的对象/发送器线程 尝试这样的事:

private void DisplyOnGrid() 
{ 
    Dispatcher.Invoke(new Action(()=> 
    { 
    Wave.Stroke = Brushes.Yellow; 
    Wave.StrokeThickness = 1.25; 
    for (int i = 0; i < DisplayGrid.Width; i++) 
    { 
     Wave.Points.Add(new Point(i, 50)); 
    } 
    DisplayGrid.Children.Add(Wave); 
    } 

))};