我的ItemsControl中有一个虚拟化堆栈面板,位于滚动查看器中。它似乎没有虚拟化:
<Page
x:Class="IWalker.Views.FullTalkAsStripView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:IWalker.Views"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ScrollViewer x:Name="theScrollViewer" VerticalScrollMode="Disabled" HorizontalScrollMode="Auto" VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Auto">
<ItemsControl x:Name="SlideStrip">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:PDFPageUserControl Margin="0 0 5 0" Height="{Binding Path=ActualHeight, ElementName=SlideStrip, Mode=OneWay}" ViewModel="{Binding}" RespectRenderingDimension="Vertical" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
</Page>
PDFPageUserControl在实例化时打印出一些调试消息 - 即使我收到超过50个项目,我也总是得到一个。 SlideStrip.ItemsSource是数据绑定的,所以我不认为这是问题(通过ReactiveUI):
this.OneWayBind(ViewModel, x => x.Pages, y => y.SlideStrip.ItemsSource);
其中Pages是ReactiveUI列表。
我错过了什么?我需要将IsVirtualizing设置为true吗?在这种情况下,附加属性在哪里(因为这不是ListBox)?
顺便说一句,我永远不会有大量的控件。问题在于每个控件都保持在图像上,并且在那个图像上保持较大的图像(例如,在高DPI显示器上的全屏幕)。我真正想做的就是在每个PDF控件不可见时释放图像,并在它出现时重新加载。所以可能有更好的方法来解决我的问题。