我对StackPanel中的UI虚拟化有一些疑问。
<ScrollViewer>
<StackPanel Orientation="Vertical">
<!--item1.-->
<StackPanel Orientation="Horizontal" Margin="5">
<Button/>
<TextBlock Text="oh hi."/>
</StackPanel>
<!--item2.-->
<StackPanel Orientation="Horizontal" Margin="5">
<Button/>
<TextBlock Text="oh hi."/>
</StackPanel>
<!--item3.-->
<StackPanel Orientation="Horizontal" Margin="5">
<Button/>
<TextBlock Text="oh hi."/>
</StackPanel>
<!--item4.-->
<StackPanel Orientation="Horizontal" Margin="5">
<Button/>
<TextBlock Text="oh hi."/>
</StackPanel>
...
<!--item9999.-->
<StackPanel Orientation="Horizontal" Margin="5">
<Button/>
<TextBlock Text="oh hi."/>
</StackPanel>
</StackPanel>
</ScrollViewer>
我听说过WPF UI虚拟化。
然后,如果我在StackPanel中添加了很多控件,那么UI Virtualization会在此StackPanel上自动运行吗?
我知道StackPanel.VirtualizingStackPanel.IsVirtualizing默认设置为True。
答案 0 :(得分:1)
但是,这里没有关于你的例子的“虚拟”。你已经在堆栈面板中明确创建了9999个项目。
虚拟化是指其他一些项目控件(如列表,树,网格)内部有虚拟化面板,并且项目控件正在生成/删除/重用项目以使其出现堆栈面板中有9999个项目,当它真的只有几个时。
与上面最简单的比较是一个ListBox控件,其中包含一个包含9999项的列表的ItemsSource,以及一个DataTemplate:
<ListBox ItemsSource="{Binding Path=TheListOf9999Items}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="5">
<Button/>
<TextBlock Text="oh hi."/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
列表框内部将有一个虚拟化堆栈面板(其ItemsPanel
),然后在您向上和向下滚动时根据需要生成项目。