私は動的にWPFレイアウトを作成していますが、別のスレッドを使用してグリッドにコントロールを追加しようとすると何らかの理由で取得します。同じスレッドから作成されたスレッドを呼び出しても、スレッドに呼び出すことはできません。
System.InvalidOperationException: '別のスレッドが所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。'
私は自分のコントロールを呼び出す必要があることを知っています。もし彼らが別のスレッドからアクセスされているなら、これは私がやっていることです。
public void controlInvoke(Grid control, Action action)
{
control.Dispatcher.Invoke((Delegate)action);
}
スレッドからグリッドに新しい行定義を追加すると、正常に動作します。
controlInvoke(installedApplicationGrid,() =>
{
installedApplicationGrid.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
});
子供は別の方法で作成されます。
private StackPanel BuildAppPanel()
{
StackPanel panel = new StackPanel();
Grid innerGrid = new Grid();
innerGrid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(50, GridUnitType.Star) });
innerGrid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(50, GridUnitType.Star) });
innerGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(100, GridUnitType.Star) });
panel.Children.Add(innerGrid);
return panel;
}
パネルを生成し、それをグリッドに追加しようとする実際のコードは、次のとおりです。
StackPanel applicationPanel = BuildAppPanel();
controlInvoke(installedApplicationGrid,() =>
{
installedApplicationGrid.Children.Add(applicationPanel);
});
エラーメッセージが表示されたのはこの時点です。私が理解していないのは、すべてのコントロールがこのスレッドを使用して動的に構築されているときに、これが起こっている理由です。行定義を追加するのがいい理由は私には意味がありませんが、新しいコントロールを追加することはできません。
誰かがこれにいくつかの光を当てることができますか?
Action内でBuildAppPanelを呼び出してみましたか? – Fildor
@Fildorそれを修正しました:) –