【发布时间】: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,并且导致内存不足异常。