0

うまくいけば、私が必要としているものと問題が何であるかを説明することができます

私は以下のリストボックスを持っています

    <ListBox Margin="0,8,0,0"  toolkit:TiltEffect.IsTiltEnabled="True" x:Name="ImageList" ItemsSource="{Binding Images}" HorizontalAlignment="Center"  BorderThickness="4">

        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Background="{Binding imageID, Converter={StaticResource ImageConverter}}" Width="125" Height="125" Margin="6" Tap="list_OnTap">

                    <TextBlock Name="description" Foreground="{Binding TextColor}" Text="{Binding text}" Visibility="{Binding ShowText, Converter={StaticResource BooleanToVisibilityConverter}}" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center" TextWrapping="Wrap"/>
                    <toolkit:ContextMenuService.ContextMenu>
                        <toolkit:ContextMenu IsZoomEnabled="False" Name="deletectx">
                            <toolkit:MenuItem Header="delete"  Click="delete_Click"/>
                        </toolkit:ContextMenu>
                    </toolkit:ContextMenuService.ContextMenu>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <toolkit:WrapPanel/>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
    </ListBox>

</Grid>

上記のコードは画像のグリッドを作成します。画像にテキストを表示する必要があるため、グリッドの背景を使用して画像を表示しました(これを行う他の方法があるかどうかはわかりません)このページには、125x125のサイズで約30枚の画像が読み込まれますピクセルとそれぞれ約4kb。大量のメモリを消費していることに気づきました。画像のキャッシュをクリアすることについてここでいくつかの投稿を読みましたが、画像コントロールではなく画像としてグリッドの背景を設定していることを考えると、上記のコードでそれをどのように行うべきかわかりません。

リストボックス内のグリッドにアクセスできる場合もありますが、それを使用すると、最初の画像にのみ適用され、残りの画像には適用されません。ナビゲートアウェイイベントで画像キャッシュをクリアする必要があります。

別の質問ですが、パフォーマンスの問題もあります。このページに入るには少し時間がかかり、Windows Phone App Analyserで低フレームレートの警告が表示されます。何をしているのかわかりません(リストボックスアイテムごとにConverterを介して画像を読み込む)正しいかどうか!どうすればこれを速くできますか?

4

1 に答える 1

0

デフォルトの画像キャッシュ動作で使用されているメモリを確実に再利用できるようにするには、次のように使用できます: (別のプロジェクトから切り取り、わずかに編集しましたが、そのまま動作するはずです)。

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
    if (e.NavigationMode == NavigationMode.Back)
    {
        // Unload all images so as to reclaim any allocated memory
        foreach (var child in VisualTreeHelperEx.GetVisualChildren(this.ImageList).Where(c => c is Image))
        {
            var image = child as Image;

            if (image != null)
            {
                var bitmapImage = image.Source as BitmapImage;

                if (bitmapImage != null)
                {
                    System.Diagnostics.Debug.WriteLine("unloading " + bitmapImage.UriSource);
                    bitmapImage.UriSource = null;
                }

                image.Source = null;
            }
        }
    }
}

このヘルパーを使用するもの:

public static class VisualTreeHelperEx
{
    public static IEnumerable<DependencyObject> GetVisualChildren(DependencyObject element)
    {
        if (element == null)
        {
            throw new ArgumentNullException("element");
        }

        return GetVisualChildrenAndSelfIterator(element).Skip(1);
    }

    public static IEnumerable<DependencyObject> GetVisualChildrenAndSelfIterator(DependencyObject element)
    {
        Debug.Assert(element != null, "element should not be null!");

        yield return element;

        int count = VisualTreeHelper.GetChildrenCount(element);

        for (int i = 0; i < count; i++)
        {
            yield return VisualTreeHelper.GetChild(element, i);
        }
    }
}

これには独自のパフォーマンスの問題がある可能性があるため、注意して使用し、実際のパフォーマンスへの影響をテストしてください。

ページ読み込み時のパフォーマンスの問題は、すべての画像が一度に読み込まれることが原因である可能性があります。これを避けるために、ページがロードされた後にそれらをリストにドリップすることができます。実際の画像が背景領域よりも大きい場合は、 と を設定する必要がDecodePixelHeightありDecodePixelWidthます。多くの複雑なコンバーターがパフォーマンスに影響を与える可能性があるため、コンバーターを削除してフル パスを持つプロパティを追加することも価値がある場合があります。

于 2013-03-25T13:57:32.723 に答える