2017-01-19 34 views
1

我的想法是創建一個列表視圖與圖像,我想插入一個InkCanvas每個圖像。 我嘗試了兩種方式,都有問題。內存不足例外Listview與圖像和inkcanvas UWP

第一種方法。

我創建的列表視圖與它的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; 

這樣,列表視圖使用虛擬化,當我在inkview寫,行程被複制每5墨跡查看。這不好。

如果我刪除虛擬化:

<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錯誤的問題。 我該如何解決它? 非常感謝。

+0

爲什麼你沒有使用'ItemsStackPanel'? –

+0

而不是listview?但是我認爲這會再次發生超過125個InkCanvas的內存問題。 – Andrea485

+0

StackPanel的intead –

回答

1

如果你是100%肯定InkCanvas事業內存不足異常,你可以做以下僞系統:

  • 當用戶未編輯的項目,它應該是堅持到磁盤/內存和位圖呈現並呈現出來。
  • 當用戶開始編輯項目,解串行化其數據和實現它作爲一個InkCanvas

即使用更少的資源密集型類型無論它是適當的

編輯

這裏的解決方案的事實,渲染InkCanvasRenderTargetBitmap會產生一個空白的圖像:

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

(需要Win2D包)

+0

可能是一個解決方案,我會嘗試。 – Andrea485