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

问题描述

我正在尝试按照问题标题中的内容进行操作。我在 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 项目 MainWindow --> Open new Window --> Thread --> Code --> Exception 的一个 Window 的 public void 中调用

解决方法

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

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

,

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

为了解决这个问题,我使用了下一个代码块,它为里面的所有代码调用调度程序。

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