2009-07-29 9 views
1

WPFの画像表示に問題があります。 ImageSourcesを表示するListViewがあります。 WPFの画像ビューアのパフォーマンスの問題

<Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
      <WrapPanel /> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
     </Setter> 

    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ListBox}"> 
       <Border x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="1"> 
        <ScrollViewer Padding="{TemplateBinding Padding}" Focusable="false"> 
         <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
        </ScrollViewer> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsEnabled" Value="false"> 
         <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
        </Trigger> 
        <Trigger Property="IsGrouping" Value="true"> 
         <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
<DataTemplate x:Key="ImagesListerViewItemsTemplate" DataType="{x:Type ImageSource}" > 
    <Border Height="150" Width="150" CornerRadius="0,0,0,0" BorderThickness="1,1,1,1" Margin="4,4,4,4" BorderBrush="#FF000000"> 
     <Border Margin="8,8,8,8" Background="#FFFFFFFF"> 
      <Border.BitmapEffect> 
       <OuterGlowBitmapEffect GlowColor="#FFFFFFFF"/> 
      </Border.BitmapEffect> 
      <Image Source="{Binding}" /> 
     </Border> 
    </Border> 
</DataTemplate> 

や写真をロードする:

private static BitmapImage LoadDisplayableImage(System.IO.FileInfo file) 
    { 
     BitmapImage bi = new BitmapImage(); 
     bi.BeginInit(); 
     bi.DecodePixelWidth = 100; 
     bi.DecodePixelHeight = 100; 
     bi.UriSource = new Uri(file.FullName); 
     bi.EndInit(); 

     return bi; 
    } 

しかし、私はサイズを変更しようとすると、希望がリストビューをスクロールしたりするときに私のプログラムは非常に遅いですフォームはわずか49枚しかありません。これと比較して、Windowsのエクスプローラでは、コンピュータに最大3000個の画像を読み込んで表示することができます。

どうすれば同じスピードを達成できますか?

答えて

1

itemspanelとして使用するwrappanelは仮想化されていないため、代わりにVirtualizedStackPanelのような仮想化パネルを使用するか、VirtualizedWrapPanelを開発して代わりに使用します.VirtualizedWrapPanelはまだWPF標準ライブラリにありません

+0

私はそれを使いました:http://blogs.msdn.com/dancre/archive/2006/02/16/implementing-a-virtualizingpanel-part-4-the-goods.aspx しかし、それが何も表示していないときには速く、写真ではまだ非常に遅いです... –

1

これらは、ここで宣言した他の準最適な属性です。

ほとんどの場合、パフォーマンスに最も大きな影響を与えるのは、ここまでに宣言したビットマップエフェクトで、これまではすべてのビットマップエフェクトがソフトウェアのみでレンダリングされていました。

また、CanContentScrollをfalseに設定すると、NOT仮想化されたラップパネルの内容は、Arsenの例に従えば= trueになります。

また、いくつかのスケーリングを行っているようですが、パフォーマンスを最適化したアプリケーション開発ネットワークであればもう一つの悪い考えです。

これは悪い比較です.3000の画像を表示しているエクスプローラは全く異なります(明らかにWindowsエクスプローラから計算されたビットマップ効果はありません)。

いずれにせよ、あなたの投稿には他の多くの問題がありますが、アカウントを持たないようです。全体的に大きな影響を与えています。