控制WPF元素

时间:2017-01-12 05:45:50

标签: c# wpf multithreading c#-4.0

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

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

1 个答案:

答案 0 :(得分:2)

您正在获取错误,因为您正在尝试访问UI / Dispatcher线程拥有的对象 尝试这样的事情:

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

 ))};