2013-06-05 8 views
1

Я разрабатываю приложение WPF, и мне нужно показать 7200 изображений в окне. Каждый размер изображения равен 300x300. Мой код «* .xaml» предъявляется ниже:Показывает много изображений в представлении WPF слишком много памяти.

<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> 
     <ItemsControl ItemsSource="{Binding Results}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Vertical"/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Grid HorizontalAlignment="Center" VerticalAlignment="Center" Height="180"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="40" /> 
          <ColumnDefinition Width="180" /> 
          <ColumnDefinition Width="180" /> 
          <ColumnDefinition Width="180" /> 
          <ColumnDefinition Width="180" /> 
          <ColumnDefinition Width="180" /> 
         </Grid.ColumnDefinitions> 
          <Grid Grid.Column="0" Margin="2"> 
           <Label Content="{Binding Frame}" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
          </Grid> 
          <Grid Grid.Column="1" Margin="2"> 
           <Grid.Background> 
            <ImageBrush ImageSource="{Binding FrameImage}"/> 
           </Grid.Background> 
           <Image Source="{Binding FrameImage}"/> 
          </Grid> 
          <Grid Grid.Column="2" Margin="2"> 
           <Grid.Background> 
            <ImageBrush ImageSource="{Binding FrameMatch}"/> 
           </Grid.Background> 
           <Image Source="{Binding FrameMatch}"/> 
          </Grid> 
          <Grid Grid.Column="3" Margin="2"> 
           <Grid.Background> 
            <ImageBrush ImageSource="{Binding ObjMatch}"/> 
           </Grid.Background> 
           <Image Source="{Binding ObjMatch}"/> 
          </Grid> 
          <Grid Grid.Column="4" Margin="2"> 

           <Image Source="{Binding ObjImage}"/> 
          </Grid> 
          <Grid Grid.Column="5" Margin="2"> 
           <Label Content="{Binding Fitness}" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
          </Grid> 
         </Grid> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </ScrollViewer> 

Проблема заключается в том, что программа потребляет на много памяти. Можно решить эту проблему? Может ли кто-нибудь дать мне решение?

+1

Попробуйте «виртуализировать» ваш пользовательский интерфейс http://msdn.microsoft.com/en-us/library/system.windows.controls.virtualizingstackpanel%28VS.95%29.aspx – jure

+0

Какая часть вашего заявления - это «это проблема "? Я не верю, что «много памяти» является правильным утверждением, вероятно, должно быть «Мне не нравится, сколько памяти он потребляет, даже если я знаю все, что нужно, из-за моего требования загружать не менее 7200 * 360 Кбайт байтов (~ 2,5 ГБ) одновременно ». –

+0

@AlexeiLevenkov Теперь я читаю о виртуализации пользовательского интерфейса, и я нашел ответ, благодаря Риду Копси, до того, как он нашел способ освободить ресурсы изображений, когда это было возможно. –

ответ

3

Можно ли преодолеть эту проблему? Может ли кто-нибудь дать мне решение?

Не показывать изображения 7200 300x300 в то же время. Это намного больше, чем любой монитор (ы) будет способен отображать сразу, поэтому было бы лучше виртуализировать это и показывать только изображения, которые находятся на экране.

Это можно сделать с помощью VirtualizingStackPanel или даже с помощью специального управления с bidirectional virtualization.