C# 控制WPF元素
我在一个类中声明了一个整数数组。使用该阵列,可以在栅格上绘制多段线。数组的元素是y坐标。阵列必须不断更新,然后显示值。我实现这个的想法是有两个线程。一个用于更新阵列的值,另一个用于在栅格上打印多段线。 更新阵列不是问题。当我尝试使用下面的代码在网格上打印多段线时,会引发一个异常,并显示以下消息:“调用线程无法访问此对象,因为其他线程拥有它。” 请建议使用线程解决此问题。也许,可以使用事件而不是线程?我愿意听取建议。感谢您的帮助C# 控制WPF元素,c#,wpf,multithreading,c#-4.0,C#,Wpf,Multithreading,C# 4.0,我在一个类中声明了一个整数数组。使用该阵列,可以在栅格上绘制多段线。数组的元素是y坐标。阵列必须不断更新,然后显示值。我实现这个的想法是有两个线程。一个用于更新阵列的值,另一个用于在栅格上打印多段线。 更新阵列不是问题。当我尝试使用下面的代码在网格上打印多段线时,会引发一个异常,并显示以下消息:“调用线程无法访问此对象,因为其他线程拥有它。” 请建议使用线程解决此问题。也许,可以使用事件而不是线程?我愿意听取建议。感谢您的帮助 public partial class MainWindow :
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();
}
}
公共部分类主窗口:窗口
{
多段线波浪=新的多段线();
公共主窗口()
{
初始化组件();
刷新();
displayongrid();
ThreadStart child=新的ThreadStart(displayongrid);
线程_DisplayOnGrid=新线程(子线程);
_DisplayOnGrid.Priority=ThreadPriority.Highest;
_DisplayOnGrid.Start();
}
私人空间
{
Wave.Stroke=画笔.黄色;
波冲程厚度=1.25;
对于(int i=0;i
由于试图访问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);
}
))};
private void displayongrid()
{
Dispatcher.Invoke(新操作(()=>
{
Wave.Stroke=画笔.黄色;
波冲程厚度=1.25;
对于(int i=0;i
由于试图访问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);
}
))};
private void displayongrid()
{
Dispatcher.Invoke(新操作(()=>
{
Wave.Stroke=画笔.黄色;
波冲程厚度=1.25;
对于(int i=0;i
为什么要从网格中删除多段线,然后再添加它?您可以简单地替换它的点
集合。除此之外,您应该使用答案中所示的调度程序,或者根本不使用线程,而是使用调度程序。为什么要从网格中删除多段线,然后再添加它?您可以简单地替换它的点
集合。除此之外,您应该使用如答案所示的Dispatcher,或者可能根本不使用线程,而是使用Dispatcher。