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
}
我正在尝试做问题标题中所说的事情。我查看了 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
}