Windows phone 8 如何在windows phone 8应用程序中释放数据模板中图像的内存?

Windows phone 8 如何在windows phone 8应用程序中释放数据模板中图像的内存?,windows-phone-8,Windows Phone 8,我有一个longlistselector,我有一个数据模板,用于定义要添加到列表中的项的类型。数据模板有一个图像控件,其源与路径动态绑定,因此列表中的每个项都有一个关联的图像控件。我面临的问题是,这些图像控件从未释放它们占用的内存,导致内存不足异常。在正常情况下,我将bitmapImage.UriSource=null设置为取消分配与位图关联的内存,但在此情况下找不到这样做的方法。下面是longlistselector的xaml代码以及与之关联的数据模板 数据模板 <phone:Phone

我有一个longlistselector,我有一个数据模板,用于定义要添加到列表中的项的类型。数据模板有一个图像控件,其源与路径动态绑定,因此列表中的每个项都有一个关联的图像控件。我面临的问题是,这些图像控件从未释放它们占用的内存,导致内存不足异常。在正常情况下,我将bitmapImage.UriSource=null设置为取消分配与位图关联的内存,但在此情况下找不到这样做的方法。下面是longlistselector的xaml代码以及与之关联的数据模板

数据模板

<phone:PhoneApplicationPage.Resources>
    <DataTemplate x:Key="MediaItemTemplate">      
        <Canvas VerticalAlignment="Top">
            <Border BorderBrush="#FF4791CA" BorderThickness="3">
                <Image Height="100" Width="100" VerticalAlignment="Top" Grid.RowSpan="2" Stretch="UniformToFill">
                    <Image.Source> 
                          <BitmapImage UriSource="{Binding path}" CreateOptions="BackgroundCreation"  DecodePixelHeight="50" DecodePixelWidth="50"/>
                    </Image.Source>
                </Image>
             </Border>
             <Image Source="/Icons/check.png" Height="16" Width="16" Grid.Row="0" Grid.Column="0" VerticalAlignment="Top" Margin="80,7,7,0" Canvas.ZIndex="100" OpacityMask="Black" Visibility="{Binding visibility}" Name="checkImage" >    
             </Image>
          </Canvas> 
      </DataTemplate>
</phone:PhoneApplicationPage.Resources>

LonglistSelector

<phone:LongListSelector 
            Tap="ListMedia_Tap"
            x:Name="ListMedia"
            HorizontalAlignment="Left"
            Height="624" 
            VerticalAlignment="Top"
            Width="436"


我对windows phone编程非常陌生,基本上我想做的是开发一种图像浏览器体验。请帮助我释放内存的方法。如果我做得完全错误,请纠正我或建议更好的方法来实现相同的功能。Thanx提前…

默认情况下,Windows Phone将从Uri下载的邮件存储在内存中,以避免再次加载邮件。(这是一种粗糙的缓存形式。)


要释放这些图像使用的内存,需要显式释放对它们的所有引用。有关更多详细信息,请参阅

我发现一个解决方案可以处理这种情况,即创建一个自定义控件来自动将urisource设置为null:

public class SafePicture : System.Windows.Controls.ContentControl
{
    public SafePicture()
    {
        this.Unloaded += this.SafePictureUnloaded;
    }

    private void SafePictureUnloaded(object sender, System.Windows.RoutedEventArgs e)
    {
        var image = this.Content as System.Windows.Controls.Image;

        if (image != null)
        {
            image.Source = null;
        }
    }
}
然后,只需将所有图片包装在该控件中:

<my:SafePicture>
    <Image Source="{Binding Path=path}" />
</my:SafePicture>


使用代码滚动时(不使用已加载),向下滚动并返回列表顶部后,图像将丢失(无论速度如何)。使用已加载、滚动的wokrs OK:可以向下滚动并返回到顶部(调试器显示调用了已卸载和已加载),并且图像就在那里。然而,当移动到另一个页面(我有母版详细信息页面)时,它们是混合的。

Wow,听起来像是一个计划。尽管它不适用于虚拟化:当再次加载项目时,它们是空的。我尝试将图像存储在私有字段中,这似乎可行,但图像以某种方式随机混合。
但图像以某种方式随机混合
可能是并发问题。加载图片是异步的,如果您要求图像控件连续加载两张图片,则第二张图片可以在第一张图片之前完成,最后将显示第一张图片,但图像设置为私有字段。或者,也许我应该将图像id存储为private,然后请求加载程序/缓存程序获取具有该id的图像?@vitalivasylenko如果没有看到您的实现,很难判断。事实上,我甚至不知道你为什么会得到空图像,我不记得有过同样的问题。等我有时间的时候,我会试着复制它。