2010-09-17 2 views
0

У меня есть datagrid с столбцом шаблона. Шаблон имеет изображение:WPF DataGrid - обновить изображение в столбце с использованием BackgroundWorkerProcess

             <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 lazilly загружает частный объект BitmapImage как пользователь прокручивает сетку. Я думал использовать другой поток для загрузки частной переменной (за свойством ProductImage). У меня возникают проблемы с моим кодом из-за разных причин ... Единственное исключение: я могу только обновлять интерфейс пользователя в потоке STA, а другой - источник зависимости не может быть в другом потоке, чем в раковине зависимости (?)

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

 var productVMList = GetProducts(); 

     _window.ReceivingBatchProductsGrid.ItemsSource = productVMList; 

     var setProductImageWorker = new BackgroundWorker(); 

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

А вот DoWork:

вар продукции = (ObservableCollection) e.Argument;

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

Любые мысли?

ответ

1

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

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

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

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

Смежные вопросы