带有图像和inkcanvas UWP的Listview上的内存不足

时间:2017-01-19 20:41:13

标签: c# xaml uwp

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

第一种方式。

我使用DataTemplate创建了listview:

<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创建了一个usercontrol 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错误的问题。 我该如何解决? 非常感谢。

1 个答案:

答案 0 :(得分:1)

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

  • 当用户没有编辑某个项目时,应该将其保存到磁盘/内存中并呈现一个位图并显示出来。
  • 当用户开始编辑项目时,对其数据进行反序列化并将其实现为InkCanvas

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

修改

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

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

(需要Win2D包)