如何将WPF控件拆分为更小的块?

如何将WPF控件拆分为更小的块?,wpf,datagrid,rendering,itemscontrol,Wpf,Datagrid,Rendering,Itemscontrol,问题是:我可以将我的DataGrid或ItemsControl拆分成更小的块来呈现控件,这样UI就不会被阻塞15秒来呈现整个控件了吗 我实际上认为render并没有阻塞UI,因为它是在不同的线程中生成的 我的ItemsControl承载多个(最多20个)数据网格。其中一些最多可以包含100行,而另一些仅短1行。当我填写潜在的可观察到的项目集合时,我经历了严重的延迟 以下是我试图做什么的简要说明: 在UIThread中,我选择了一些数据 此数据被发送到VM 2.5. VM设置IsBusy标志,使

问题是:我可以将我的DataGrid或ItemsControl拆分成更小的块来呈现控件,这样UI就不会被阻塞15秒来呈现整个控件了吗

我实际上认为render并没有阻塞UI,因为它是在不同的线程中生成的


我的ItemsControl承载多个(最多20个)数据网格。其中一些最多可以包含100行,而另一些仅短1行。当我填写潜在的可观察到的项目集合时,我经历了严重的延迟

以下是我试图做什么的简要说明:

  • 在UIThread中,我选择了一些数据
  • 此数据被发送到VM 2.5. VM设置IsBusy标志,使ItemsControl将模板更改为加载占位符屏幕
  • VM在BackgroundWorker中进行了几个DB请求
  • VM BackgroundWorker Dispatcher。每次调用一个数据视图,将数据视图返回到VM的ObservableCollection 到目前为止,一切都很好:UI负责,progressbar更新等等,但是:
  • VM信号:IsBusy=false=>ItemsControl将其模板更改回原始状态
  • UI挂起约15秒,以呈现ItemsControl中的所有数据网格(我可以看到CPU高CPU使用率)
  • 下面是一些代码:

    XAML(我将ItemsControl放在ScrollViewer中,因为我发现这是使内容可滚动的唯一方法。):

    
    
    我认为OuterScrollViewer对于包含的控件(例如DataGrid)不需要虚拟化,因为它们具有无限的高度。打开DataGrid时,您是使用DataGrid中的滚动来导航,还是使用外部scrollviewer上的滚动?如果答案是外部的,那么DataGrid没有虚拟化。Scrollviewer控制滚动。但是我必须把鼠标指针移到滚动条上才能使它工作。如果我删除scrollviewer,则无论我使用什么itemcontainer,itemscontrol的内容都将不可滚动。
    <ScrollViewer VerticalScrollBarVisibility="Auto" Grid.Column="1" Grid.Row="0" 
                          VirtualizingStackPanel.IsVirtualizing="True"
                          VirtualizingStackPanel.VirtualizationMode="Recycling">
        <ItemsControl 
                      DataContext="{Binding Source={StaticResource TerminalMaskVM}}"
                      VirtualizingStackPanel.IsVirtualizing="True"
                      VirtualizingStackPanel.VirtualizationMode="Recycling"
                      Style="{StaticResource LoadingControl}"
                      ItemsSource="{Binding Source={StaticResource TerminalMaskVM}, Path=TerminalMasks}"
                      x:Name="MaskContainer">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <DockPanel
                        VirtualizingStackPanel.IsVirtualizing="True"
                        VirtualizingStackPanel.VirtualizationMode="Recycling"
                        IsItemsHost="True"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemContainerStyle>
                <Style>
                    <Setter Property="DockPanel.Dock" Value="Top"/>
                </Style>
            </ItemsControl.ItemContainerStyle>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Expander IsExpanded="True" Header="{Binding MaskTableName}">
                            <gui:DataGrid ItemsSource="{Binding MaskTable}"
                                          EnableColumnVirtualization="True"
                                          VirtualizingStackPanel.IsVirtualizing="True"
                                          VirtualizingStackPanel.VirtualizationMode="Recycling"
                             ...columns definitions, etc..
                             ...closing tags here