【问题标题】:Out of memory Exception on Listview with images and inkcanvas UWP带有图像和inkcanvas UWP的Listview内存不足异常
【发布时间】:2017-01-20 06:17:42
【问题描述】:

我的想法是创建一个带有图像的列表视图,在每个图像上我想插入一个 InkCanvas。 我尝试了两种方法,但都有问题。

第一种方式。

我用它的 DataTemplate 创建了列表视图:

<DataTemplate x:Name="ListViewItemTemplate">
        <Grid>
           <Image></Image>
           <InkCanvas></InkCanvas>
        </Grid>
</DataTemplate>

<ItemsPanelTemplate x:Name="ListItemsPanelTemplate">
        <VirtualizingStackPanel Orientation="Vertical">
            <VirtualizingStackPanel.ChildrenTransitions>
                <TransitionCollection/>
            </VirtualizingStackPanel.ChildrenTransitions>
        </VirtualizingStackPanel>
</ItemsPanelTemplate>

<ListView x:Name="list" 
    ItemTemplate="{StaticResource ListViewItemTemplate}"
    ItemsPanel="{StaticResource ListItemsPanelTemplate}">
</ListView>

c#:

 List<Image> pages = new List<Image>();
    list.ItemsSource = pages;

这样,listview使用了虚拟化,当我在一个inkview中写的时候,每5个inkview就复制一次笔画。这不好。

如果我删除虚拟化:

<ItemsPanelTemplate x:Name="ListItemsPanelTemplate">
        <StackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>

出现第二种方式的问题。写在下面。

第二种方式:

我为 DataTemplate 创建了一个用户控件 PageFormat,如下所示:

<UserControl>
<Grid Background="White">
    <Image x:Name="image"></Image>
    <InkCanvas x:Name="ink" ></InkCanvas>
</Grid>
</UserControl>

<ListView x:Name="list" ></ListView>

c#:

List<PageFormat> pages= new List<PageFormat>();
list.ItemsSource = pages;

这样我有以下问题:like in this question

当我创建超过 125 个 InkCanvas 时,我遇到了内存问题。 我更喜欢第二种方式,因为我可以直接在用户控件中处理页面格式,但我无法解决这些问题。

我想解决生成 InkCanvas System.OutOfMemoryException 错误的问题。 我该如何解决? 非常感谢。

【问题讨论】:

  • 你为什么不使用ItemsStackPanel
  • 而不是列表视图?但是我认为这会再次出现超过 125 个 InkCanvas 的内存问题。
  • 代替 StackPanel
  • 另外,App中的Image和源图片的尺寸是多少?
  • 我只发布了没有属性的元素,应用程序正常工作,我查看图像,少于 125 个图像没有问题,图像太多会出现问题,因为它无法创建超过 125 个 InkCanvas,并且导致内存不足异常。

标签: c# xaml uwp


【解决方案1】:

如果您 100% 确定 InkCanvas内存不足 异常的原因,您可以执行以下伪系统:

  • 当用户不编辑项目时,它应该被持久化到磁盘/内存中,并在其中渲染和呈现位图。
  • 当用户开始编辑项目时,反序列化其数据并将其实现为InkCanvas

即在适当的地方使用资源较少的类型

编辑

以下是将InkCanvas 渲染为RenderTargetBitmap 会产生空白图像的解决方案:

https://mtaulty.com/2016/02/16/windows-10-uwp-inkcanvas-and-rendertargetbitmap/

(需要Win2D包)

【讨论】:

  • 可能是一个解决方案,我会尝试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多