【问题标题】:WPF DataGrid - update image in column using BackgroundWorkerProcessWPF DataGrid - 使用 BackgroundWorkerProcess 更新列中的图像
【发布时间】:2010-09-17 19:13:24
【问题描述】:

我有一个带有模板列的数据网格。模板有一张图片:

                                                        <Image HorizontalAlignment="Left" Name="ImageProduct" Stretch="None"  VerticalAlignment="Center" Grid.Row="0" Grid.Column="0"  Source="{Binding Path=ProductImage, Mode=OneWay}" RenderOptions.BitmapScalingMode="HighQuality"/>

网格滚动非常缓慢,因为 ProductImage 在用户滚动网格时会延迟加载私有位图图像对象。我正在考虑使用另一个线程来加载私有变量(在 ProductImage 属性后面)。由于各种原因,我的代码遇到了麻烦...一个例外是我只能在 STA 线程上更新 UI,另一个是依赖源不能位于与依赖接收器不同的线程中 (?)

我想不出一个好的方法来做到这一点。网格的代码看起来像这样,在后台工作人员尝试失败:

        var productVMList = GetProducts();

        _window.ReceivingBatchProductsGrid.ItemsSource = productVMList;

        var setProductImageWorker = new BackgroundWorker();

        setProductImageWorker.DoWork += setProductImageWorker_DoWork;
        setProductImageWorker.RunWorkerAsync(productVMList); 

这里是 DoWork:

var products = (ObservableCollection)e.Argument;

        foreach (var product in products)
        {
            product.SetProductImage();
        }

有什么想法吗?

【问题讨论】:

    标签: wpf backgroundworker


    【解决方案1】:

    通常,依赖对象只能在创建它们的线程上使用。但是,从Freezable 继承的那些(例如ImageSource可以从另一个线程中使用,只要它们被冻结。因此,当您在另一个线程上创建 ImageSource 对象时,只需在将它们发送到 UI 之前对它们调用 Freeze,它应该可以正常工作。

    使图像异步加载的一种简单方法是使用Binding.IsAsync 属性:

    <Image ... Source="{Binding Path=ProductImage, Mode=OneWay, IsAsync=True}" ... />
    

    这样你就不用担心在加载图像时创建新线程和更新目标属性,它由 WPF 自动处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      • 2020-05-22
      • 1970-01-01
      • 2018-12-03
      • 2015-12-04
      • 1970-01-01
      • 2011-12-31
      相关资源
      最近更新 更多