我的想法是创建一个包含图像的列表视图,在每个图像上我想插入一个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错误的问题。 我该如何解决? 非常感谢。
答案 0 :(得分:1)
如果您100%确定InkCanvas
导致内存不足异常,则可以执行以下伪系统:
InkCanvas
即。在适当的地方使用资源消耗较少的类型
修改强>
以下解决方案是将InkCanvas
渲染为RenderTargetBitmap
会产生空白图像:
https://mtaulty.com/2016/02/16/windows-10-uwp-inkcanvas-and-rendertargetbitmap/
(需要Win2D包)