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>

上面的代码制作了一个图像网格,我使用网格背景来显示图像,因为我需要在图像上显示我的文本(不确定是否有其他方法可以做到这一点)这个页面加载了大约 30 个大小为 125x125 的图像像素,每个大约 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);
        }
    }
}

这可能有它自己的性能问题,因此请谨慎使用并测试对实际性能的影响。

页面加载的性能问题可能是由于一次加载所有图像。您可以在页面加载后将它们滴入列表以避免这种情况。如果实际图像大于背景区域,则应设置DecodePixelHeightDecodePixelWidth。删除转换器并添加具有完整路径的属性可能也是值得的,因为许多复杂的转换器会影响性能。

于 2013-03-25T13:57:32.723 回答