programing

WPF DataGrid 렌더링 속도가 매우 느림

testmans 2023. 6. 4. 10:20
반응형

WPF DataGrid 렌더링 속도가 매우 느림

저는 WPF의 맞춤형 데이터 그리드와 재고 데이터 그리드를 모두 사용해 보았습니다.바인딩을 통해 수동으로 입력해 보았습니다.두 경우 모두 속도가 느립니다.

사용자가 버튼을 클릭하면 적절한 데이터와 함께 데이터 그리드가 나타나는 시나리오가 있습니다.현재 저는 개념 증명 모드에 있으며 샘플 데이터를 사용하고 있습니다.열 개의 행이 있는 테이블이 있는 데이터 세트가 있습니다.

빈 DataGrid가 거의 즉시 표시되는 버튼을 클릭할 때 DataGrid에 데이터를 첨부하지 않으면 사용자는 지연을 인식할 수 없습니다.제가 10줄의 데이터를 추가하자마자, 6줄의 경우, 사용자에게 매우 눈에 띄는 약 2초의 지연이 발생합니다.

저는 빈 그리드를 표시하기 위해 빈 데이터로 채우기도 시도했지만 속도가 똑같이 느립니다.

for (int i = 0; i < 10; i++)
    _dataGrid.Items.Add("");

버튼을 클릭했을 때부터 DataGrid를 그리기 위해 모든 코드가 실행되고 약 20밀리초이기 때문에 코드가 매우 빠르게 실행되지만 화면에는 큰 지연이 발생합니다.그리드 뷰를 사용해 봤는데 화면이 훨씬 빠르게 렌더링됩니다.

복잡한 시나리오와 1000개의 행을 사용하는 느린 DataGrid 그리기에 대한 다양한 보고서를 들어봤지만, 6열 x 10열이 비어 있는 데이터로 채워지는 것은 간단합니다.

읽기 전용 디스플레이의 경우 GridView가 DataGrid와 동일하게 실행 가능한 옵션입니까?


갱신하다

이것이 제 칼럼의 작성입니다.

                DataGridTextColumn column = new DataGridTextColumn();
                column.ColumnWidthChanged += new ColumnWidthChangedEventHandler(column_ColumnWidthChanged);

                column.Header = entity.GetPropertyValue("ColumnLabel");
                column.Binding = new Binding(entity.GetPropertyValue("Tag"));
                column.Width = new DataGridLength(entity.GetPropertyDouble("DisplaySize"));
                _dataGrid.Columns.Add(column);

이렇게 하면 데이터 세트를 10개의 행으로 묶을 수 있습니다.

                _dataGrid.ItemsSource = ds.Tables[0].DefaultView;
                _dataGrid.DataContext = ds.Tables[0];

내가 다르게 할 수 있는 것이 무엇인지 잘 모르겠어요.

다음이 있습니까?

  • VirtualizingStackPanel.VirtualizationMode그리드의 경우? 그렇지 않은 경우 - 설정해 보십시오.
  • 가상화 스택 패널을 설정합니다.DataGrid에 대한 가상화= "참"입니까?
  • 그리드를 스택 패널 컨테이너로 포장하시겠습니까?예인 경우 - 제거를 시도합니다.
  • 외부 ScrollViewer 컨트롤로 그리드를 감쌌습니까?예인 경우 - 제거를 시도합니다.

한 가지 더 말씀드리자면, 그리드에 각 항목을 추가하는 대신 전체 항목 컬렉션을 한 번에 바인딩할 수 있습니다.항목 모음?

반인팁적에 대한 인 팁.DataGrid: 창 크기 조정, 열 정렬 을 수행한 후 데 문자 하여 새로).DataGrid에 문제가 있어서 창 크기 조정, 열 정렬 등을 수행한 후 새로 고치는 데 몇 초가 걸렸고, 새로 고치는 동안 창 UI가 잠겼습니다(1000행, 5열).

WPF 크기 조정 계산과 관련된 문제(버그?)로 귀결되었습니다.저는 그것을 그들과 연결시켰습니다.RowDefinition Height="Auto"이는 렌더링 시스템이 런타임에 각 열과 행의 크기를 측정하여 데이터 그리드의 크기를 재계산하도록 했습니다(제가 이해하는 바로는 전체 그리드를 채움).어떻게든 지능적으로 처리해야 하지만 이 경우에는 그렇지 않았습니다.

이것이 관련된 문제인지 확인하는 간단한 확인은 다음과 같은 설정입니다.Height그리고.Width테스트 기간 동안 데이터 그리드의 속성을 고정 크기로 설정하고 다시 실행해 보십시오.성능이 복원된 경우 영구 수정 옵션이 다음 중 하나일 수 있습니다.

  • 포함된 요소의 크기를 상대(*) 또는 고정 값으로 변경합니다.
  • MaxHeight그리고.MaxWidth으로 사용할 수보다 더 큰 를 사용할 수 .
  • 조절전략이 해 보십시오(" 크 조 컨 유 시 도 니 합 다 을 형 너 이 테 다 기 정 전Grid,DockPanel계속)

제가 구글에서 찾은 블로그는 일종의 해결책을 주었습니다.작성자의 말대로 GroupStyle을 비활성화하여 렌더링 속도 문제가 해결되었습니다.하지만 저는 그룹이 필요했습니다.작가는 말했습니다.

VirtualizingPanel.IsVirtualizingWhenGrouping

는 .NET 4.5에 추가되었습니다.그래서 저는 그것을 진실로 설정했습니다.그룹화를 통해 렌더링이 신속해집니다.문제는...스크롤이 나직합니다.용납할 수 없을 정도로 육포는 아니지만 눈에 띄게 육포입니다.2000개 이상의 노드가 확장된 TreeView를 만들 때도 비슷한 문제가 있었습니다.가상화를 사용하지 않을 경우 렌더링 속도는 느렸지만 스크롤은 원활했습니다.가상화를 통해 렌더링 속도는 빨라졌지만 스크롤 속도는 느려졌습니다.

왜 둘 다...

저의 경우 DataGridCell ControlTemplate에 문제가 있어 렌더링 속도가 상당히 느려졌습니다.

대용량 데이터 세트의 상대 로드 속도는 읽기 전용 모드에서 TextBlock(선택할 수 없는 텍스트) 또는 TextBox를 사용할 때 매우 다릅니다.

로딩 시간 59초:

<Style TargetType="{x:Type DataGridCell}" x:Key="DataGridCellTextStyle">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                    <TextBox IsReadOnly="True" Text="{Binding Mode=OneWay}"/> 
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

로딩 시간 21초:

<Style TargetType="{x:Type DataGridCell}" x:Key="DataGridCellTextStyle">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                     <ContentPresenter Content="{Binding}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

로드 시간 16초:

<Style TargetType="{x:Type DataGridCell}" x:Key="DataGridCellTextStyle">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                    <TextBlock Text="{Binding}"></TextBlock>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

음, 조금 더 추가합니다(나는 그것의 아주 오래된 주제를 알고 있지만 여전히 누군가를 돕습니다).

나는 노력했다.

EnableColumnVirtualization="True" VirtualizingPanel.VirtualizationMode="Recycling"
EnableRowVirtualization="True" 

그리드에 대해 설명합니다.AutoGenerateColumns="True" DataTable에 바인딩되어 있습니다.DefaultView() 및 속도에 영향을 주지 않음, 속도뿐만 아니라 행 간 탐색에도 여전히 심각했습니다.그래서 저는 데이터 그리드의 고정 높이와 너비를 설정할 수 있는 솔루션을 생각해냈습니다.추가로 저도 설정했습니다.

RowHeight="23" 
ScrollViewer.HorizontalScrollBarVisibility="Visible"
ScrollViewer.VerticalScrollBarVisibility="Visible"

이것은 내 페이지를 매우 빠르게 채웁니다...지금은 2분이 아니라 10~12초 정도 걸립니다.

누군가에게 도움이 되길 바랍니다.

참고: 을 사용합니다.넷 4.5

렌더링 시간이 7-10초 정도 소요되는 1000개 행, 5개 열에 큰 문제가 있었습니다. 하지만 https://www.elegant-software.net/2014/05/performance-of-the-wpf-datagrid.html 에서 찾은 솔루션은 즉시 그리드를 로드할 수 있었습니다.

<DataGrid
   EnableRowVirtualization="True"
   EnableColumnVirtualization="True">

나에게 그것은 다음과 같았습니다.

<Setter Property='ScrollViewer.CanContentScroll' Value='False' />

스타일에서 이것을 제거했고 렌더링이 빨라졌습니다.

저는 서피스 프로 3를 가지고 있는데, 약 200줄의 행과 10개의 열을 가진 제 데이터 그리드는 스크롤이 느리고, 육중하고, 주저했습니다.

저는 그것이 네트워크라고 생각했지만, 사실은 그래픽 카드가 데이터 그리드 자체에 대한 드롭 섀도우 효과를 따라잡을 수 없었습니다. 컨트롤의 배경이 단색으로 설정되었음에도 불구하고.

저는 그 효과에 대해 언급했고 그것은 4-5배 더 빨랐습니다.

이게 도움이 되길 바랍니다.

바인딩된 데이터 그리드에도 동일한 문제가 있으며, 첫 로드에서는 빠르지만 두 번째 로드에서는 느립니다.그래서 코드를 추가할 때

DataGrid.ItemsSource = Nothing그리고 나서.TableAdapter.Fill(Mydataset.MyStoredProcedure,....) DataGrid.ItemsSource=Mydataset.MyStoredProcedure그것은 매우 빨라졌습니다.

내 문제는 내가 가지고 있었다는 것입니다.ScrollViewer.CanContentScroll="False"내 데이터 그리드에 설정.이렇게 하면 DataGrid의 가상화가 모두 비활성화됩니다.이에 대한 자세한 내용은 다음에서 확인할 수 있습니다.

https://stackoverflow.com/a/3724695/4383302

be love와 같은 행 정의가 있는 경우:

 <Grid.RowDefinitions>
        <RowDefinition x:Name="topRow" Height="*"/>
        <RowDefinition x:Name="mainRow" Height="*"/>
        <RowDefinition x:Name="dataGridRow" Height="*"/>
    </Grid.RowDefinitions>

당신은 조심해야 합니다!예를 들어 데이터 그리드가 이러한 행 중 하나에 있는 경우 모든 행에 대해 크기가 계속 조정됩니다.행이 1000개인 경우 데이터 그리드의 1000배 크기가 조정됩니다!

Datagrid가 3번째 행 정의에 있음을 알려드리고, 이 방법으로 코드를 변경하는 것이 좋습니다.

     <Grid.RowDefinitions>
        <RowDefinition x:Name="topRow" Height="*"/>
        <RowDefinition x:Name="mainRow" Height="*"/>
        <RowDefinition x:Name="dataGridRow" Height="400"/>
    </Grid.RowDefinitions>

물론 "400"을 원하는 대로 변경할 수도 있습니다.

언급URL : https://stackoverflow.com/questions/6680879/wpf-datagrid-is-very-slow-to-render

반응형