2017-11-23 7 views
0

私は動的に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); 
}); 

エラーメッセージが表示されたのはこの時点です。私が理解していないのは、すべてのコントロールがこのスレッドを使用して動的に構築されているときに、これが起こっている理由です。行定義を追加するのがいい理由は私には意味がありませんが、新しいコントロールを追加することはできません。

誰かがこれにいくつかの光を当てることができますか?

+0

Action内でBuildAppPanelを呼び出してみましたか? – Fildor

+0

@Fildorそれを修正しました:) –

答えて

0

これをもう少し慎重に見た後、私はアクション内でBuildPanelを動かすことで修正しました。

controlInvoke(installedApplicationGrid,() => 
{ 
    StackPanel applicationPanel = BuildAppPanel(); 
    installedApplicationGrid.Children.Add(applicationPanel); 
});  

すべてが現在動作しています。提案に感謝@Fildor。

+0

なぜ私は尋ねたのですか?「applicationPanel」が別のスレッドで作成されたため、エラーが発生したと思います。だから、スレッドはそれを "所有"しています。アクションに作成を移動すると、正しいスレッドがそれを所有します。 – Fildor

関連する問題