約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が呼び出されてラップアイテムが作成されます。しばらく遊んだ後、以前と同じ時間に作成された各アイテムを表示するようになりました。