6

約45個のかなり大きな画像(約680x1000)があり、単純なユーザーコントロール(塗りつぶし、画像、テキストブロック、および2つの側面の長方形を含む丸みを帯びたバックボーダー)に読み込んでから、ラップパネルに表示する必要があります。画像はプログラムのロード時にすべて表示されるため、仮想化はここではあまり役に立ちません。

BitmapImage initの内部で、decodepixel幅を設定できることはわかっていますが、これは少し役立ちますが、品質を損なうことなくスライダーで画像のサイズを変更できるようにしたいので、すべてをフルサイズでロードするのが好きです(この部分は高速に動作します)ほとんどの場合)。1つの可能性は、decodewidthを、表示可能な最大サイズが役立つ可能性があるために設定した数値に設定することです。

バックグラウンドで画像をロードするにはどうすればよいですか?にあるマルチスレッドアプローチを試しました。(最初の答え)しかし、それはプログラムがロードするのにかなり長い時間がかかる原因になりました!

何か案は?

現在のロードコード:

BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
//bmp.DecodePixelWidth = 400;
bmp.UriSource = new Uri(file.FullName);
bmp.EndInit();
bmp.Freeze();
images.Add(bmp);

サンプルXAMLコード:

        <Border x:Name="backBorder" Background="Black" Padding="2" Margin="3" CornerRadius="3,3,4,4" 
            BorderBrush="Black" BorderThickness="1"
            MouseEnter="backBorder_MouseEnter" MouseLeave="backBorder_MouseLeave" MouseLeftButtonUp="backBorder_MouseLeftButtonUp" >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="16" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition Width="15" />
        </Grid.ColumnDefinitions>
        <Image x:Name="imageBox" Stretch="Fill" Width="{Binding Path=ImageWidth, ElementName=me}" Height="{Binding Path=ImageHeight, ElementName=me}" />
        <Border x:Name="backRatingBorder" Grid.Column="1" Margin="3,0,0,0" BorderBrush="Blue" Background="White" BorderThickness="1"/>
        <Border x:Name="frontRatingBorder" Grid.Column="1" Margin="3,0,0,0" BorderBrush="Blue" Background="LightBlue" BorderThickness="1" VerticalAlignment="Bottom" Height="50"/>
        <TextBlock x:Name="textBlock" Grid.Row="1" Grid.ColumnSpan="2" TextAlignment="Center" Background="Transparent" Foreground="White" FontFamily="Segoe UI" FontWeight="SemiBold" FontSize="12" />
   </Grid>
</Border>

アップデート:

さて、私は単一のバックグラウンドワーカーで画像の読み込みループを実行することで応答性を高めることになりました。各画像が読み込まれると、Dispacher.Invokeが呼び出されてラップアイテムが作成されます。しばらく遊んだ後、以前と同じ時間に作成された各アイテムを表示するようになりました。

4

1 に答える 1

1

画像の読み込みだけで全体的なパフォーマンスに満足している場合は、このマルチスレッドUIチュートリアルを試すことができます。私はそれを非常に簡単に動作させることができましたが、ループですべての画像をロードしている場合、すべての画像のロードが完了するまでビジュアルは更新されません。ただし、すべての読み込みは別のスレッドで行われるため、UIはこの間応答します。

または、すべての画像をループで読み込んでいる場合は、WindowsフォームのDoEventsメソッドの改良版を試すことができます(例までスクロールダウンしてください)。各画像を読み込んだ後にこれを呼び出すと、UIがそれ自体を更新する機会が与えられます(ユーザーインタラクションの処理など)。これは、プロジェクトのマップタイルをロードするときに使用したアプローチであり、最初のアプローチよりも簡単です。

于 2010-07-01T00:20:17.207 に答える