2

WPF には次のコードがあります。

wrapPanel.Dispatcher.Invoke(new Action(() =>
{
    wrapPanel.Children.Add(myCanvas);
}));

これを実行すると、

「別のスレッドが所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません」

私が知っているように、呼び出しdispatcher.Invoke()はこの問題を解決するはずです。

なぜこのエラーが発生するのですか? これにはどのような理由が考えられますか?

私の実際のコードは長すぎるので、ここには貼り付けませんでした。ちなみに私はノブです。

4

1 に答える 1

1

WPF を使用する場合、関連する UI オブジェクトによって表示されるデータ オブジェクトを操作します。sを使用して、データオブジェクトBindingを操作して UI を更新します。私はあなたの状況に合わせてこのようなものを実装します...最初にあなたにバインドするを作成します:DependencyPropertyMainWindow.cs

public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(
    "Items", typeof(ObservableCollection<Image>), typeof(MainWindow), 
    new UIPropertyMetadata(new ObservableCollection<Image>()));

public ObservableCollection<Image> Items
{
    get { return (ObservableCollection<Image>)GetValue(ItemsProperty); }
    set { SetValue(ItemsProperty, value); }
}

次に、データ プロパティを表示する UI コードを追加します。

<ItemsControl ItemsSource="{Binding Items}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

最後に、 を設定する必要DataContextがあります(これは最も好ましくない方法ですが、この例では最も簡単です):

public MainWindow()
{
    InitializeComponent();
    DataContext = this;
}

Dispatcher.Invokeこれを達成するための呼び出しは必要ありません。

于 2013-09-09T10:34:11.950 に答える