2

CollectionViewSource が ItemSource プロパティにバインドされている DataGrid があります。

<DataGrid Grid.Row="0" RowBackground="#10808080" AlternatingRowBackground="Transparent"
          HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
          ItemsSource="{Binding Source={StaticResource bookingsViewSource}}"
          RowHeight="27"
          VirtualizingPanel.IsVirtualizingWhenGrouping="True"
          VirtualizingPanel.IsContainerVirtualizable="True"
          VirtualizingPanel.ScrollUnit="Item"
          AutoGenerateColumns="False">

    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding date, StringFormat=dd.MM.yyyy}" Header="date"/>
        <DataGridTextColumn Binding="{Binding Path=customers.name}" Header="customer"/>
        <DataGridTextColumn Binding="{Binding Path=customers.street}" Header="adress"/>
    </DataGrid.Columns>

    <DataGrid.GroupStyle>
        <GroupStyle>
            <GroupStyle.ContainerStyle>
                <Style TargetType="{x:Type GroupItem}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Expander Header="{Binding Path=Name}" IsExpanded="True">
                                    <ItemsPresenter />
                                </Expander>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </GroupStyle.ContainerStyle>
        </GroupStyle>
    </DataGrid.GroupStyle>
</DataGrid>

bookingsViewSourceと定義されている

<CollectionViewSource x:Key="bookingsViewSource"
                      d:DesignSource="{d:DesignInstance {x:Type Database:bookings}}">
    <CollectionViewSource.GroupDescriptions>
        <PropertyGroupDescription PropertyName="providerID"/>
    </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>

コードビハインドセクションに入力されます。グループ化せずに、すべてが高速かつスムーズに実行されていました。しかし、グループ化を追加すると<PropertyGroupDescription PropertyName="providerID"/>、DataGrid の読み込みに約 1 分かかります。

.NET 4.5 には、呼び出される新しいプロパティがあり、VirtualizingPanel.IsVirtualizingWhenGrouping既にこれを true に設定していますが、読み込み時間は短縮されませんでした。

理由がわかりません。何か案は?

4

1 に答える 1

6

本から: MacDonald M. - C# での Pro WPF 4.5

多くの要因により、UI の仮想化が予期せず中断されることがあります。

  • リスト コントロールを ScrollViewer に配置する: ScrollViewer は、その子コンテンツにウィンドウを提供します。問題は、子コンテンツに無制限の「仮想」スペースが与えられることです。この仮想空間では、ListBox がフル サイズでレンダリングされ、そのすべての子項目が表示されます。副作用として、各アイテムは、メモリを大量に消費する独自の ListBoxItem オブジェクトを取得します。この問題は、サイズを制限しようとしないコンテナーに ListBox を配置するたびに発生します。たとえば、Grid ではなく StackPanel にポップすると、同じ問題が発生します。
  • リストのコントロール テンプレートを変更し、ItemsPresenter を使用しない: ItemsPresenter は、VirtualizingStackPanel を指定する ItemsPanelTemplate を使用します。この関係を壊したり、ItemsPanelTemplate を自分で変更して VirtualizingStackPanel を使用しないようにしたりすると、仮想化機能が失われます。
  • データ バインディングを使用しない: 当然のことですが、必要な ListBoxItem オブジェクトを動的に作成するなど、プログラムによってリストを埋める場合、仮想化は行われません。もちろん、必要なオブジェクトだけを作成し、必要なときにだけ作成するなど、独自の最適化戦略の使用を検討することもできます。第 22 章では、ジャストインタイムのノード作成を使用してディレクトリ ツリーを埋める TreeView を使用して、この手法の動作を確認します。大きなリストがある場合は、優れたパフォーマンスを確保するために、これらのプラクティスを避ける必要があります。

また、私の場合、問題はMahApps.Metroスタイルが原因でした。

于 2015-12-23T14:52:00.140 に答える