【问题标题】:Taking Control of WPF elements控制 WPF 元素
【发布时间】:2017-01-12 05:45:49
【问题描述】:

我在一个类中声明了一个整数数组。使用该数组,在网格上绘制折线。数组的元素是 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();
    }
}

【问题讨论】:

  • 为什么要从网格中删除折线,然后再添加?相反,您可以简单地替换其 Points 集合。除此之外,您应该使用答案中所示的 Dispatcher,或者可能根本不使用 Thread,而是使用 DispatcherTimer。

标签: c# wpf multithreading c#-4.0


【解决方案1】:

您收到错误是因为您尝试访问 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);
   }

 ))};

【讨论】:

    猜你喜欢
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2022-11-21
    • 2011-04-22
    相关资源
    最近更新 更多