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

标签 windows-phone-8

我有一个长列表选择器,我有一个数据模板,用于定义要添加到列表中的项目类型。数据模板有一个图像控件,其源与路径动态绑定(bind),因此列表中的每个项目都有一个关联的图像控件。我面临的问题是这些图像控件永远不会释放它们占用的内存,导致内存不足异常。在正常情况下,我设置 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>

长列表选择器

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

背景=“透明”

ItemTemplate="{StaticResource MediaItemTemplate}" LayoutMode="Grid"GridCellSize="120,120"/>

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

最佳答案

我发现处理这种情况的解决方案是制作一个自定义控件来自动将 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>

关于windows-phone-8 - 如何释放 Windows Phone 8 应用程序中数据模板中图像占用的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17571825/

相关文章:

c# - Windows Phone 8.1 的绘图控件(通用应用程序)

windows - 如何在 Windows Phone 8 中获取视频文件的视频缩略图?

c# - Windows Phone 8 设备可以用于测试使用 WP SDK 7.1 构建的应用程序吗

windows-phone-8 - Windows Phone 8 错误 - 应用程序安装失败

android - 如何从 Windows Phone 8 中的特定提供商获取位置信息?

c# - 无法访问 Windows Phone 中的 MessageBox 类

visual-studio - Windows Phone 8.1 模拟器的问题

windows-phone-8 - 抱歉,您没有下载此应用程序的权限。在 Windows Phone 中下载应用程序时出现此消息

c# - Windows 手机 : How to stay in the Current page rather than navigating to another page?

windows-phone-8 - InvalidOperation 异常、背景音频代理、Windows Phone 8