如果我在StackPanel中添加了很多控件,那么会应用UI虚拟化吗?

时间:2011-09-09 16:28:34

标签: wpf virtualization

我对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。

1 个答案:

答案 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),然后在您向上和向下滚动时根据需要生成项目。