8

这是我用于在 XAML 中绑定图像的代码

               <Border  toolkit:TiltEffect.IsTiltEnabled="true" Height="350" Width="400" Grid.ColumnSpan="3">
                        <Grid  Height="350" Width="400" Margin="70,0,70,0" x:Name="Container1">
                            <Grid.Background>
                                <ImageBrush ImageSource="{Binding ImageCollection[0]}" Stretch="Uniform" AlignmentX="Left" AlignmentY="Center"/>
                            </Grid.Background>
                            <i:Interaction.Triggers>
                                <i:EventTrigger EventName="Tap">
                                    <i:InvokeCommandAction Command="{Binding ImageTapCommand}" CommandParameter="CONTAINER0"/>
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                        </Grid>
                    </Border>

同样,我使用 4 边框来显示我最近的图像。

在我的 ViewModel 中,我使用以下方法从隔离存储中读取图像。

 public Stream GetFileStream(string filename, ImageLocation location)
    {
        try
        {
            lock (SyncLock)
            {
                if (location == ImageLocation.RecentImage)
                {
                    filename = Constants.IsoRecentImage + @"\" + filename;
                }
                using (var iSf = IsolatedStorageFile.GetUserStoreForApplication())
                {
                    if (!iSf.FileExists(filename)) return null;
                    var fs = iSf.OpenFile(filename, FileMode.Open, FileAccess.Read);
                    return fs;
                }
            }

        }
        catch (Exception ex)
        {
                 return null;
        }

    }

在获得流之后,我将使用下面编写的方法四构建WritableBitmap用于 UI 绑定

     private WriteableBitmap BuildImage(Stream imageStream)
    {
        using (imageStream)
        {
            var image = new BitmapImage();
            image.SetSource(imageStream);
            return new WriteableBitmap(image);
        }
    }

在这种情况下,我的问题是在我的页面导航两到三次之后。应用程序在我使用“image.SetSource(imageStream);”的 BuildImage() 方法上崩溃 方法。我尝试了很多替代方案,但都失败了。我得到的例外是“System.OutOfMemoryException”

我尝试了图像控件而不是图像画笔。

我尝试了 Bitmap 而不是 WritableBitmap 等,但结果是一样的。

如果我使用小图像,应用程序崩溃率会降低。但是通过相机拍摄的图像的崩溃率很高。

上周我正在尝试解决此问题,但没有找到解决此问题的任何替代方法。

我找到了一个讨论类似问题的链接,但没有很多人解决这个问题

4

4 回答 4

3
Try this, 

  var bitmapImage = new BitmapImage();
  bitmapImage.SetSource(stream);
  bitmapImage.CreateOptions = BitmapCreateOptions.None;
  var bmp = new WriteableBitmap((BitmapSource) bitmapImage);
  bitmapImage.UriSource = (Uri) null;
  return bmp;
于 2013-04-25T07:13:19.373 回答
1

您是否尝试过强制垃圾收集器运行以查看是否有任何区别。

GC.Collect();

这不是一种解决方案 - 您永远不必调用GC.Collect,但它可能有助于确定您的问题是内存泄漏还是只是内存回收的延迟。

于 2013-05-07T01:08:03.947 回答
1

Silverlight 默认缓存图像以提高性能。您应该 image.UriSource = null在使用 BitmapImage 处理资源后调用。

于 2013-04-24T21:06:13.183 回答
1

您是否在使用它们后IsolatedStorageFileStream重置/处理它们?IsolatedStorageFile

于 2013-05-06T12:01:08.843 回答