私は大ListView
部分がInkCanvas
オブジェクトである大きなものを持ってListView
います。ビュー内の表示されているアイテムに応じて、ビュー内のアイテムを「巧みに」アンロードおよびロードするデータ仮想化を実装していることがわかりました。これに関する問題は、多くのListView
場合アイテムがキャッシュされ、新しいアイテムが追加されると、ビューに既に追加されているアイテムが基本的にコピーされることです。したがって、私の場合、ユーザーがストロークを Inkcanvas に追加してから新しい InkCanvas を ListView に追加すると、新しいキャンバスには前のキャンバスのストロークが含まれます。ここで報告されているように、これはデータの仮想化によるものです。私の ListView は次のように実装されています。
<Grid HorizontalAlignment="Stretch">
<ListView x:Name="CanvasListView" IsTapEnabled="False"
IsItemClickEnabled="False"
ScrollViewer.ZoomMode="Enabled"
ScrollViewer.HorizontalScrollMode="Enabled"
ScrollViewer.VerticalScrollMode="Enabled"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollViewer.VerticalScrollBarVisibility="Visible"
HorizontalAlignment="Stretch">
<!-- Make sure that items are not clickable and centered-->
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel>
<local:CanvasControl Margin="0 2"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
MinWidth="1000" MinHeight="100" MaxHeight="400"
Background="LightGreen"/>
<Grid HorizontalAlignment="Stretch" Background="Black" Height="2"></Grid>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch">
<InkToolbar x:Name="inkToolbar"
VerticalAlignment="Top"
Background="LightCoral"/>
<StackPanel HorizontalAlignment="Right">
<Button x:Name="AddButton" Content="Add Page" Click="Button_Click"/>
<TextBlock x:Name="PageCountText" />
</StackPanel>
</StackPanel>
</Grid>
完全な例はここで見つけることができ、問題のビデオはここにあります。実際、データ仮想化をオフにする (またはに切り替えるItemsControl
) と、すべてが見事に機能します。ただし問題は、リストが非常に大きい場合、このアプローチはパフォーマンスに大きな影響を与えることです (60 以上の InkCanvas コントロールを使用すると、アプリがクラッシュするだけです)。アイテムの重複を避けながら、データの仮想化を維持する方法はありますか? 試してみましVirtualizationMode.Standard
たが、アイテムはまだ複製されています。