WPF DataGrid - обновить изображение в столбце, используя BackgroundWorkerProcess - PullRequest
0 голосов
/ 17 сентября 2010

У меня есть таблица данных со столбцом шаблона. Шаблон имеет изображение:

                                                        <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, а другое - источник зависимости не может быть в другом потоке, чем приемник зависимости (?)

Я не могу придумать хороший способ сделать это. Код для сетки выглядит примерно так с неудачной попыткой фонового работника:

        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();
        }

Есть мысли?

1 Ответ

1 голос
/ 17 сентября 2010

Обычно объекты зависимостей могут использоваться только в потоке, который их создал.Однако те, которые наследуются от Freezable (например, ImageSource) , могут использоваться из другого потока, если они заморожены.Поэтому, когда вы создаете ImageSource объекты в другом потоке, вам просто нужно вызвать Freeze для них перед отправкой в ​​пользовательский интерфейс, и все должно работать нормально.

Простой способ сделать изображенияасинхронная загрузка означает использование свойства Binding.IsAsync:

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

Таким образом, вам не нужно беспокоиться о создании нового потока и обновлении целевого свойства при загрузке изображения, оно автоматически обрабатывается WPF.

...