缓慢的用户控件加载WPF:ListBox无法虚拟化

时间:2019-02-08 22:06:57

标签: c# wpf user-controls

我的MVVM WPF应用程序使用Linq2SQL来使用SQL Server Express。我注意到在用实际数据填充数据库后,UI更新出现了很大的延迟,并且认为这是我的查询/分组策略。但是,尽管某些数据填充需要100毫秒以上的时间,但很少会花费200毫秒以上的时间,但是我看到窗口刷新可能会延迟3秒。编辑简介:

我将ItemsControl包装在ScrollViewer中:

    <ScrollViewer VerticalScrollBarVisibility="Auto" Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2" ScrollChanged="ScrollViewer_ScrollChanged">
        <ItemsControl x:Name="DivisionItems" ItemsSource="{Binding oObsByDiv}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <uc:ucObservationsHeader/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </ScrollViewer>

但是在从下面获得一些提示并阅读了虚拟化之后,我现在使用一个ListBox像这样:

<ListBox x:Name="DivisionItems" Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2" 
ItemsSource="{Binding oObsByDiv}" 
ScrollViewer.CanContentScroll="True"
VirtualizingStackPanel.ScrollUnit="Pixel">
<ListBox.Template>
    <ControlTemplate>
        <ScrollViewer VirtualizingStackPanel.IsVirtualizing="True"
                        VirtualizingStackPanel.VirtualizationMode="Recycling">
            <ItemsPresenter/>
        </ScrollViewer>
    </ControlTemplate>
</ListBox.Template>
<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <VirtualizingStackPanel/>
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
    <DataTemplate>
        <uc:ucObservationsHeader/>
    </DataTemplate>
</ListBox.ItemTemplate>

该模板中用于Items的用户控件然后以非常相似的方式调用另一个包装在另一个ListBox中的用户控件:

<ListBox ItemsSource="{Binding lObs}" Grid.Row="1" Grid.Column="1"
HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.CanContentScroll="True"
VirtualizingStackPanel.ScrollUnit="Pixel">
<ListBox.Template>
    <ControlTemplate>
        <ScrollViewer VirtualizingStackPanel.IsVirtualizing="True"
                        VirtualizingStackPanel.VirtualizationMode="Recycling">
            <ItemsPresenter/>
        </ScrollViewer>
    </ControlTemplate>
</ListBox.Template>
<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <VirtualizingStackPanel/>
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
        <DataTemplate>
            <uc:ucObservationsView/>
        </DataTemplate>
</ListBox.ItemTemplate>

但是仍然存在多个秒延迟。外部用户控件实例化15次,内部用户控件平均每个实例有15个项目。在这种情况下,打破虚拟化的原因是什么?我一直在一个或两个地方剥去ScrollUnit和CanContentScroll以及Horizo​​ntalContentAlignement和Horizo​​ntalScrollBar可见性,但是这些只是影响外观,而似乎并不是破坏虚拟化的原因。

0 个答案:

没有答案