0
我很难理解为什么这个简单的方法不起作用 如果我理解正确,UIElements只能由他们自己的线程改变,后台线程不能。 试用此代码时。它抛出:WPF Dispatcher.BeginInvoke和线程访问
InvalidOperationException - 调用线程不能访问此对象,因为不同的线程拥有它。
代码以供参考:
Canvas c = new Canvas();
RootWindow.AddChild(c);
Thread r = new Thread(new ThreadStart(() =>
{
Polygon p = new Polygon();
PointCollection pC = new PointCollection();
pC.Add(new Point(1.5, 4.5));
pC.Add(new Point(-7, 9));
pC.Add(new Point(1.5, -5));
pC.Add(new Point(10, 9));
p.Points = pC;
p.Stroke = Brushes.Black;
p.Fill = Brushes.Green;
c.Dispatcher.BeginInvoke(DispatcherPriority.Normal , new Action(() => { c.Children.Add(p); }));
}));
r.SetApartmentState(ApartmentState.STA);
r.Start();
'System.Windows.Media.PointCollection'是一个'DependencyObject'。你不能在一个线程(后台线程)上实例化它,并在另一个线程(UI线程)上使用它。 –
http://stackoverflow.com/questions/11923865/how-to-deal-with-cross-thread-access-exceptions –