c# - 调用线程无法访问此对象,因为另一个线程拥有它。即使在使用调度程序之后

标签 c# wpf wpf-controls dispatcher

在 WPF 中我有这段代码:

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

当我运行它时,我得到了

"The calling thread cannot access this object because a different thread owns it"

据我所知,调用 dispatcher.Invoke() 应该可以解决这个问题。

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

由于我的实际代码太长,我没有将其全部粘贴在这里。顺便说一下,我是个菜鸟。

最佳答案

使用 WPF 时,我们使用通过关联 UI 对象显示的数据对象。使用 Binding,我们通过操作 data 对象来更新 UI。我会针对你的情况实现类似的东西......首先在你的 MainWindow.cs 中创建一个 DependencyProperty 以绑定(bind)到:

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 调用来实现这一点。

关于c# - 调用线程无法访问此对象,因为另一个线程拥有它。即使在使用调度程序之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18686698/

相关文章:

c# - WPF 中的 EndEdit 等效项

c# - 从 WPF 中的 DataGridRow 获取列值

c# - 一个泛型类型参数,返回类型不同的泛型?

c# - 如何使用 get 方法将字符串查询到网站?

c# - 如何将绑定(bind)的 TextBlock 的部分加粗?

WPF - 绑定(bind) StringFormatting 不起作用

c# - 将项目添加到 StackPanel 时的事件处理程序?

c# - 为什么没有将 native DLL 复制到输出目录

c# - 使用 C# 将字符串转换为 GSM 7 位

c# - 如何在 WPF 中的多显示器显示上定位窗口?