调用线程无法访问此对象,因为其他线程拥有它.即使在使用调度程序之后

本文关键字:线程 之后 调度程序 拥有 因为 访问 对象 调用 其他 | 更新日期: 2023-09-27 18:30:32

在WPF中,我有以下代码:

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

当我运行这个时,我得到

"调用线程无法访问此对象,因为其他线程拥有它"

据我所知,打电话给dispatcher.Invoke()应该可以解决这个问题。

为什么我会收到此错误?这可能是什么原因?

由于我的实际代码太长,我没有将其全部粘贴到此处。顺便说一句,我是一个菜鸟。

调用线程无法访问此对象,因为其他线程拥有它.即使在使用调度程序之后

使用 WPF 时,我们使用通过关联 UI 对象显示的数据对象。使用 Binding s,我们通过操作数据对象来更新 UI。我会针对您的情况实施这样的事情......首先在MainWindow.cs中创建一个要绑定到的DependencyProperty

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调用即可实现此目的。