C# - 在线程内使用 Dispatcher 以编程方式将 RowDefinition 添加到 Grid

C# - Adding a RowDefinition to a Grid programmatically using Dispatcher inside a Thread

我正在尝试做问题标题中所说的事情。我查看了 MSDN,如果您使用线程访问 UI 线程,则需要使用 Dispatch 调用。无论如何,这并没有解决我的问题。 这是我的代码,我需要做什么来解决它?谢谢!:

static void example()
{
     for (int i = 0; i < amountRows; i++)
     {
          RowDefinition rowD = new RowDefinition();
          gridSizes.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { gridSizes.RowDefinitions.Add(rowD); }));
          Console.WriteLine("added"); // never gets to here cuz the dispatcher produces an exception
     }
}

Reproduce:
new Thread(() =>
{
    example();
}).Start(); 

此代码已从 WPF 项目的 Window 的 public 无效调用,MainWindow --> 打开新的 Window --> 线程--> 代码 --> 异常

我相信因为 RowDefinition 也是一个 DependencyObject,所以您需要在 UI 线程上创建它,以便它与您的 Grid 一起工作。将 RowDefinition rowD = new RowDefinition() 移动到 Dispatcher.Invoke 调用中应该可以解决这个问题。

当然,在上面的示例中,第二个威胁毫无意义,因为它本身什么都不做,但我假设在您的完整代码中,您的第二个线程实际上在做某事。

正如@Keith Stein 所说,RowDefinition 是一个 DependencyObject,因此为了从线程中调用它,必须使用 Dispatcher.Invoke。

为了解决这个问题,我使用了下一个代码块,它为其中的所有代码调用 Dispatcher。

App.Current.Dispatcher.Invoke((Action)delegate ()
{
      //your code here
}