C# 网格元素在.Children.Add-in WPF上引发异常

C# 网格元素在.Children.Add-in WPF上引发异常,c#,wpf,multithreading,xaml,C#,Wpf,Multithreading,Xaml,我在一个单独的线程上,我正在尝试向网格(在XAML中定义)添加一个子元素,因此我的第一反应是这样做: var someElement = new TextBlock { Text = "Hello world" }; Dispatcher.Invoke(() => MainGrid.Children.Add(someElement)); 但似乎抛出了一个异常,消息是“调用线程无法访问该对象,因为它是另一个线程拥有的。” 我还尝试了MainGrid.Dispatcher.Invoke和Ap

我在一个单独的线程上,我正在尝试向网格(在XAML中定义)添加一个子元素,因此我的第一反应是这样做:

var someElement = new TextBlock { Text = "Hello world" };
Dispatcher.Invoke(() => MainGrid.Children.Add(someElement));
但似乎抛出了一个异常,消息是“调用线程无法访问该对象,因为它是另一个线程拥有的。”

我还尝试了
MainGrid.Dispatcher.Invoke
Application.Current.Dispatcher.Invoke
,但它们都引发相同的异常


为了查看发生了什么,我创建了一个TextBlock元素(也在XAML中定义)。我用一个简单的
Dispatcher.Invoke
调用编辑了它的
Text
属性。这是什么原因?如何修复它?

可能您试图在错误的线程上创建TextBlock?这是否有效:

Dispatcher.Invoke(() =>
{ 
    var someElement = new TextBlock { Text = "Hello world" };
    MainGrid.Children.Add(someElement)
});

也许您试图在错误的线程上创建TextBlock?这是否有效:

Dispatcher.Invoke(() =>
{ 
    var someElement = new TextBlock { Text = "Hello world" };
    MainGrid.Children.Add(someElement)
});

@Andrew,我也认为问题出在你的文本块中,请尝试以下方法:

this.Dispatcher.Invoke(new Action(() => { MainGrid.Children.Add(new TextBlock(){Text = "Hello World"}); }));

@Andrew,我也认为问题出在你的文本块中,请尝试以下方法:

this.Dispatcher.Invoke(new Action(() => { MainGrid.Children.Add(new TextBlock(){Text = "Hello World"}); }));

你能告诉我你的“someElement”是什么吗?它是在代码隐藏中定义的?或者xaml?
someElement
将是在调用之前通过代码隐藏创建的元素。我会编辑使它更清晰。我试着像你的代码一样,但它工作正常。您可以试试这个:this.Dispatcher.Invoke(新操作(()=>{MainGrid.Children.Add(newtextblock(){Text=“Hello World”});});你能告诉我你的“someElement”是什么吗?它是在代码隐藏中定义的?或者xaml?
someElement
将是在调用之前通过代码隐藏创建的元素。我会编辑使它更清晰。我试着像你的代码一样,但它工作正常。您可以试试这个:this.Dispatcher.Invoke(新操作(()=>{MainGrid.Children.Add(newtextblock(){Text=“Hello World”});});是的,这就是问题所在!在我最初发布的代码中,我在一个单独的线程上创建了TextBlock。通过Dispatcher创建TextBlock后,一切正常。是的,这就是问题所在!在我最初发布的代码中,我在一个单独的线程上创建了TextBlock。通过Dispatcher创建TextBlock后,一切都正常工作。