【问题标题】:Grid element throwing exception on .Children.Add in WPF网格元素在WPF中的.Children.Add上引发异常
【发布时间】:2014-02-11 10:33:43
【问题描述】:

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

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

但似乎抛出了异常,消息是“调用线程无法访问此对象,因为不同的线程拥有它。”

我也尝试过MainGrid.Dispatcher.InvokeApplication.Current.Dispatcher.Invoke,但它们都抛出了相同的异常。

为了尝试查看发生了什么,我创建了一个 TextBlock 元素(也在 XAML 中定义)。我已经用一个简单的Dispatcher.Invoke 调用编辑了它的Text 属性,这很有效。这是什么原因?我该如何解决?

【问题讨论】:

  • 你能告诉我你的'someElement'是什么吗?它是在代码隐藏中定义的?还是 xaml?
  • someElement 将是在调用之前通过代码隐藏创建的元素。我将进行编辑以使其更清晰。
  • 我试过你的代码,但它工作正常。你能试试这个:this.Dispatcher.Invoke(new Action(() => { MainGrid.Children.Add(new TextBlock(){Text = "Hello World"}); }));

标签: c# wpf multithreading xaml


【解决方案1】:

也许您试图在错误的线程上创建 TextBlock?这行得通吗:

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

【讨论】:

  • 是的,这就是问题所在!在我最初发布的代码中,我在单独的线程上创建了 TextBlock。通过 Dispatcher 创建 TextBlock 后,一切正常。
【解决方案2】:

@Andrew,我也认为问题出在您的文本块中,请尝试以下操作:

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

【讨论】:

    猜你喜欢
    • 2011-03-12
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2014-12-23
    相关资源
    最近更新 更多