1

デザインのようなグリッドに 1000 を超える画像を含むリストボックスを作成しようとしています。設計に関しては、次のようになります。

http://i.stack.imgur.com/7URQD.jpg

UI の仮想化が壊れてしまい、stackpanel がそのようなグリッド (?) に画像をリストできないため、wrappanel を使用できないため、https://virtualwrappanel.codeplexの修正版を使用してこの問題を解決しようとしています。 .com

私のXAML:

<ListBox x:Name="GameWheel" ItemsSource="{Binding GameData}" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Hidden">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <c:VirtualizingWrapPanel IsItemsHost="True" />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Image x:Name="GameImage" Source="{Binding Path=ImagePath}" Width="{Binding ElementName=GameWheel, Path=ActualWidth, Converter={StaticResource widthConverter}}" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

このアプローチは機能しますが、特に画像幅でバインドを使用する場合は、まだかなり遅く、バグがあります。同じ結果をアーカイブするより良い方法はありますか? できればカスタム ラップパネルなしで。

4

1 に答える 1

1

私のVirtualizingWrapPanelの実装を確認してください。NuGetからも入手できます (さらに含まれています) 。

このコードは、もともとこのCodeProject の記事からのもので、ほとんど機能しており、開始した場所と同じように見えます。途中でいくつかのバグを修正し、パフォーマンスを改善したので、あなたにも役立つかもしれません.

更新:VirtualizingWrapPanel.ItemWidth鍵は、ではなくにバインドすることですImage.Width。の両方の実装にバグがあり、またはの値が変更されたVirtualizingWrapPanel場合に子のサイズが変更されませんでした。このコミットでこのバグを修正しました(358 行目)。ItemHeightItemWidth

確かにこれは強引な修正ですが、私はあなたのために何かをチェックインしてもらいたかったので、出かけなければなりません. 10,000枚の画像でテストしたところ、非常にきびきびしていました。私はより良い解決策に取り組み(つまり、値が変更されたことがわかっている場合にのみ再測定します)、変更したときにこの回答を更新します。

更新 2: child.Measure を改善するクイック チェンジ このコミット.

//TODO: If either child Height or Width == PositiveInfinity and the other side == ChildSlotSize then we probably don't need to measure. Need to test this
if (!child.DesiredSize.Equals(ChildSlotSize))
{
    child.Measure(ChildSlotSize);
}

まだ改善の余地がありますが、今すぐ適切なテストを行う時間はありません。これは機能します。

于 2015-08-27T22:59:29.667 に答える