WPF – WrapPanel не обновляет/перерисовывает содержимое изображений

Я загружаю изображения из папки, показывая их в оберточной панели в виде «больших значков» Windows, чтобы пользователь мог выбирать/отмечать, какие изображения он хотел бы.

В настоящее время я читаю расположение файлов изображений, добавляю их в список строк и устанавливаю ItemSource в ItemsControl, который выглядит следующим образом:

<ItemsControl x:Name="ItemsControlPhotos" Margin="10" >
    <ItemsControl.Template>
        <ControlTemplate>
            <WrapPanel FlowDirection="LeftToRight" IsItemsHost="true">
            </WrapPanel>
        </ControlTemplate>
    </ItemsControl.Template>
    <ItemsControl.ItemTemplate>
        <DataTemplate >
            <Image Source="{Binding}" Width="100" Height="100" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Кажется, это работает нормально. Но некоторые изображения выглядят странно, как будто они нарисованы только один раз. См. это видео для примера.

Я пытался вручную обновить список с помощью нескольких разных подходов:

ЭлементыКонтроляФото.Предметы.Обновить();

ItemsControlPhotos.InvalidateArrange();

ItemsControlPhotos.InvalidateMeasure();

ЭлементыКонтроляФото.InvalidateVisual();

Но ничего из этого не имеет никакого эффекта, так что я как бы потерян.

Большое спасибо за Вашу помощь! :)

РЕДАКТИРОВАТЬ: Это полная разметка окна:

    <Window x:Class="Name.Space"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        mc:Ignorable="d"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:System="clr-namespace:System;assembly=mscorlib"
        Title="PhotoChooser" 
        WindowState="Maximized"
        Width="1280"
        >
  <Window.Resources>
    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="../Styles/Styles.xaml" />
      </ResourceDictionary.MergedDictionaries>
      <System:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">40</System:Double>
    </ResourceDictionary>
  </Window.Resources>

  <Border BorderBrush="Black" BorderThickness="1" Background="White" Width="1280">

    <DockPanel>

      <Image Source="..\Images\BGTop.png" DockPanel.Dock="Top" Grid.Row="0" />

      <Grid DockPanel.Dock="Top" Margin="0,-80,0,0" >
        <Grid.RowDefinitions>
          <RowDefinition Height="Auto" />
          <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <ScrollViewer>
          <ItemsControl x:Name="ItemsControlPhotos" Margin="10" >
            <ItemsControl.Template>
              <ControlTemplate>
                <WrapPanel FlowDirection="LeftToRight" IsItemsHost="true">
                </WrapPanel>
              </ControlTemplate>
            </ItemsControl.Template>
            <ItemsControl.ItemTemplate>
              <DataTemplate >
                <Image Source="{Binding}" Width="100" Height="100" />
              </DataTemplate>
            </ItemsControl.ItemTemplate>
          </ItemsControl>
        </ScrollViewer>
      </Grid>

      <Grid DockPanel.Dock="Bottom">
        <Button Height="50" Width="200" Click="ButtonBase_OnClick">Add photos</Button>
        <Image  Source="..\Images\BGBottom.png" Grid.Row="99" VerticalAlignment="Bottom" Margin="0,0,0,0" />
      </Grid>

    </DockPanel>
  </Border>
</Window>

person Farsen    schedule 19.03.2014    source источник
comment
это больше похоже на проблему родительского контейнера, что такое родительский контейнер?   -  person thumbmunkeys    schedule 19.03.2014
comment
Я добавил полный windoww xaml.   -  person Farsen    schedule 19.03.2014
comment
Вы говорите, что установили ItemSource в ItemsControl. Это то, что вы имели в виду? ItemsSource должен быть ObservableCollection или подобным, содержащим ваши элементы данных.   -  person Tim Rogers    schedule 19.03.2014
comment
У меня был список строк, поэтому я изменил его на ObservableCollection, но это не помогло. Спасибо хоть..   -  person Farsen    schedule 19.03.2014


Ответы (1)


Я не очень разобрался в проблеме, но нашел решение во время работы над проектом.

Вместо загрузки всего изображения я хотел бы загрузить только миниатюру, чтобы ускорить процесс. Поэтому я перешел по этой ссылке: http://blogs.msdn.com/b/dditweb/archive/2007/08/22/speeding-up-image-loading-in-wpf-using-thumbnails.aspx

И теперь проблема ушла. Спасибо Вам за Ваш вклад! :)

person Farsen    schedule 19.03.2014