希望我能解释我需要什么以及问题是什么
我有以下列表框
<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 Analyzer中得到低帧率警告,不知道我在做什么(通过Converter为每个加载图像)列表框项目)是对还是不对! 我怎样才能让它更快?
答案 0 :(得分: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
。由于许多复杂的转换器会影响性能,因此删除转换器并添加具有完整路径的属性也是值得的。