我有一个很大的对象,它在ListView
很大程度上实现了数据虚拟化,以根据视图中的可见项目“巧妙地”卸载和加载视图中的项目。这样做的问题是,很多时候缓存项目,当添加一个新项目时,它实际上复制了已经添加到视图中的项目。所以在我的例子中,如果用户向 Inkcanvas 添加一个笔触,然后向 ListView 添加一个新的 InkCanvas,则新的画布包含来自前一个画布的笔触。正如这里所报道的,这是因为数据虚拟化。我的 ListView 实现如下: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
但项目仍然重复。