2013-02-06 4 views
2

У меня есть GridView в приложении для магазина Windows, у которого есть ItemContainerStyleSelector. Внутри стиля есть элемент управления Image, который имеет настраиваемое свойство зависимости для установки источника (это значит, что я могу получить дескриптор изображения и подключиться к незагруженному событию). Моя проблема заключается в том, что изображение никогда не выгружается и, кажется, используется повторно. Это означает, что когда я устанавливаю источник, изображение также устанавливается на другие элементы в GridView (для примера у меня есть объект, у которого нет изображения, но после прокрутки, а затем назад он имеет изображение с другого объекта).Force GridView для создания неперерабатываемых элементов управления

Я попытался установить режим виртуализации на стандарт, где могу, но это не помогает. Любые идеи очень приветствуются.

Вот изображение, которое содержится в этом стиле. Это передается методу «OnRemoteURISourceChanged» при установке. Я ожидал бы другого управления изображением всякий раз, когда вызывается метод, но это не так.

<Image x:Name="BackgroundImage" DataContext="{Binding CurrentBackdrop}" helpers:ImageExtensions.RemoteURISource="{Binding Uri}" Stretch="UniformToFill"/> 

А вот мой GridView

<GridView x:Name="ItemsGrid" Grid.Row="1" ItemsSource="{Binding BrowseResults}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" Margin="20,0,20,0" 
       IsItemClickEnabled="True" ItemClick="ItemsGrid_ItemClick" VirtualizingStackPanel.VirtualizationMode="Standard"> 
     <GridView.ItemContainerStyleSelector> 
      <controls:UPnPCDStyleSelector CDObject="{StaticResource somestyle1}" Container="{StaticResource somestyle2}" Item="{StaticResource somestyle3}"/> 
     </GridView.ItemContainerStyleSelector> 
     <GridView.ItemsPanel> 
      <ItemsPanelTemplate VirtualizingStackPanel.VirtualizationMode="Standard"> 
       <WrapGrid Orientation="Vertical" VirtualizingStackPanel.VirtualizationMode="Standard"/> 
      </ItemsPanelTemplate> 
     </GridView.ItemsPanel> 
    </GridView> 

UPDATE: Проблема, как представляется, WrapGrid. Если я изменил это на VirtualizationStack Panel и установил VirtualizationMode в стандарт, тогда все будет работать так, как ожидалось, но, очевидно, мои позиции появляются только на одной строке, а не на нескольких строках, как я желаю.

Как настроить виртуализацию WrapGrid?

ответ

0

Есть ли шанс, что ваш helpers:ImageExtensions.RemoteURISource не имеет значения Image.Source, если ваше имущество CurrentBackdrop или его значение Uri не имеет значения?

+1

Это, безусловно, виртуализировано. Это переработка по сравнению со стандартной виртуализацией, которая вызывает у меня проблемы. Он наследуется от VirtualizingPanel-> OrientatedVirtualizingPanel http://msdn.microsoft.com/en-gb/library/windows/apps/windows.ui.xaml.controls.wrapgrid – Oli

+0

Мой плохой. Тем интереснее то, что делает ваше расширение. –

+0

В основном он берет источник и устанавливает источник изображения в методе Async. Поскольку у меня есть DP, у меня есть доступ к элементу управления Image, поэтому мне не нужно возвращать пустой BitmapImage, как в конвертере. Это означает, что вы не видите пустого изображения в течение короткого времени при смене изображений. Он также ожидает, что управление изображением будет выгружено, поэтому задача Async может быть отменена, если этого не потребуется. Все это отлично работает с VirtualizingStackPanel с установленной виртуализацией, но с WrapGrid изображения никогда не разгружаются до тех пор, пока страница не будет оставлена, а один и тот же элемент управления изображением будет повторно использован. – Oli

0

Вы уверены, что задача, загружающая исходный код img, возвращается в контекст ui по умолчанию при ожидании? Я не думаю, что это хорошая идея, чтобы установить код формы Property.Source. Лучшим решением было бы создать пользовательский наблюдаемый класс задач и связать im source с его результатом. В фоновом режиме вы можете вызвать задачу. Вам нужен элемент управления для изображения? Потому что, если бы это был элемент управления с шаблоном, вам было бы легче сделать это. Я могу отправить вам класс, который сделает это, если вы захотите.

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