亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當列表框中有圖像時,為什么會出現OutOfMemoryException?

當列表框中有圖像時,為什么會出現OutOfMemoryException?

C#
鴻蒙傳說 2019-12-02 10:59:03
我想在我的自定義庫中ListBox顯示Windows Phone 8照片文件夾中存儲的所有圖像,該文件夾用于顯示圖像。的ListBox代碼如下:    <phone:PhoneApplicationPage.Resources>        <MyApp:PreviewPictureConverter x:Key="PreviewPictureConverter" />    </phone:PhoneApplicationPage.Resources>    <ListBox Name="previewImageListbox" VirtualizingStackPanel.VirtualizationMode="Recycling">        <ListBox.ItemsPanel>            <ItemsPanelTemplate>                <VirtualizingStackPanel CleanUpVirtualizedItemEvent="VirtualizingStackPanel_CleanUpVirtualizedItemEvent_1">                </VirtualizingStackPanel>            </ItemsPanelTemplate>        </ListBox.ItemsPanel>        <ListBox.ItemTemplate>            <DataTemplate>                <Grid>                    <Image Source="{Binding Converter={StaticResource PreviewPictureConverter}}" HorizontalAlignment="Center" VerticalAlignment="Center" />                </Grid>            </DataTemplate>        </ListBox.ItemTemplate>     </ListBox>使用以下轉換器:public class PreviewPictureConverter : System.Windows.Data.IValueConverter{    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)    {        PreviewImageItem c = value as PreviewImageItem;        if (c == null)            return null;        return c.ImageData;    }    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)    {        throw new NotImplementedException();    }}圖像存儲在自定義類中:class PreviewImageItem{    public Picture _picture = null;    public BitmapImage _bitmap = null;    public PreviewImageItem(Picture pic)    {        _picture = pic;    }所有這些都可以正常工作,但是代碼OutOfMemoryException在顯示幾張圖像后崩潰(特別是在快速滾動時)。滾動VirtualizingStackPanel_CleanUpVirtualizedItemEvent_1時,該方法稱為常規(例如,每2或3個列表框條目)ListBox。此示例代碼有什么問題?為什么沒有釋放內存(足夠快)?
查看完整描述

3 回答

?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

哦,最近我整天殺了這個,使它正常工作!


所以解決方案是:


使您的圖像控件免費資源。所以設置


BitmapImage bitmapImage = image.Source as BitmapImage;

bitmapImage.UriSource = null;

image.Source = null;

如前所述。


確保在列表的每個項目上虛擬化_bitmap。您應該按需加載它(LongListSelector.Realized方法),并且必須銷毀它!它不會自動收集,并且GC.Collect也不能工作??找靡膊黄鹱饔?(但是這里是方法:制作1x1像素文件。將其復制到程序集中并從中獲取資源流以處置1x1像素為空白的圖像。將自定義處置方法綁定到LongListSelector.UnRealized事件(e。容器處理您的列表項)。


public static void DisposeImage(BitmapImage image)

{

    Uri uri= new Uri("oneXone.png", UriKind.Relative);

    StreamResourceInfo sr=Application.GetResourceStream(uri);

    try

    {

        using (Stream stream=sr.Stream)

        {

            image.DecodePixelWidth=1; //This is essential!

            image.SetSource(stream);

        }

    }

    catch { }

}

在LongListSelector中為我工作,每個圖像有1000張寬度為400的圖片。


如果您錯過了數據收集的第2步,則可以看到良好的結果,但是在滾動100-200個項目后內存溢出。


查看完整回答
反對 回復 2019-12-02
  • 3 回答
  • 0 關注
  • 556 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號