2011-05-12 2 views
1

ListView/GridView에 문제가 있습니다. 사실, 그리드에는 285 개의 행과 24 개의 열이 동적으로 생성되어 있습니다.많은 수의 행, 열 및 셀 템플릿이있는 ListView의 GridView

내 그리드가 너무 느린 다음 XAML (이론적으로 더 효율적이어야 함)에서 다른 테스트를 직접 수행하기로 결정했습니다. 모든 열에는 CellTemplate이 있습니다.

쉽게이 함께 문제를 재현 할 수 있습니다

<Window x:Class="WpfApplication2.HighColumns" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:sys="clr-namespace:System;assembly=mscorlib" 
Title="HighColumns" Height="300" Width="300"> 
<Window.Resources> 
    <DataTemplate x:Key="myCellTemplateMonth"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition/> 
       <ColumnDefinition/> 
      </Grid.ColumnDefinitions> 
      <Border Grid.Column="0" BorderThickness="1,0,1,1" SnapsToDevicePixels="True" BorderBrush="Black" Margin="-6,0,-6,0"> 
       <TextBlock Grid.Column="0" Text="{Binding}"/> 
      </Border> 
      <Border Grid.Column="1" BorderThickness="1,0,1,1" SnapsToDevicePixels="True" BorderBrush="Black" Margin="-6,0,-6,0"> 
       <TextBlock Grid.Column="0" Text="{Binding}"/> 
      </Border> 
     </Grid> 
    </DataTemplate> 
</Window.Resources> 
<Grid> 
    <ListView Background="Transparent" BorderThickness="0" Name="lv2" Grid.Column="1"> 
     <ListView.ItemContainerStyle> 
      <Style TargetType="{x:Type ListViewItem}"> 
       <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
       <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
      </Style> 
     </ListView.ItemContainerStyle> 
     <ListView.View> 
      <GridView x:Name="gv1"> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
        <!--<GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <Grid> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition/> 
            <ColumnDefinition/> 
           </Grid.ColumnDefinitions>    
           <Border Grid.Column="0" BorderThickness="1,0,1,1" SnapsToDevicePixels="True" BorderBrush="Black" Margin="-6,0,-6,0"> 
            <TextBlock Grid.Column="0" Text="{Binding}"/> 
           </Border> 
           <Border Grid.Column="1" BorderThickness="1,0,1,1" SnapsToDevicePixels="True" BorderBrush="Black" Margin="-6,0,-6,0"> 
            <TextBlock Grid.Column="0" Text="{Binding}"/> 
           </Border> 
          </Grid> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate>--> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
       <GridViewColumn Width="300" Header="Indics" CellTemplate="{StaticResource myCellTemplateMonth}"> 
       </GridViewColumn> 
      </GridView> 
     </ListView.View> 
     <sys:DateTime>1/2/3</sys:DateTime> 
     <sys:DateTime>4/5/6</sys:DateTime> 
     <sys:DateTime>7/8/9</sys:DateTime> 
     <sys:DateTime>10/11/12</sys:DateTime> 
     [paste the previous 4 ligns here in order to have around 300 rows] 
    </ListView> 
</Grid> 

당신은 약간의 그래픽 버그 각 열에서 "이중 열"스타일 (볼 수 있지만주의를 지불하지

이 사실).

주요 문제는 그리드의 SLOW입니다. 분명히 전문적인 그리드로 사용할 수 없습니다. 가상화를 사용하려고 시도했을 때 (가상화가 비활성화 된 경우 약 17-18 초가 소요됩니다. 그리드를로드하려면 ...)

고속 그리드 또는 내가 잘못하고있는 것을 달성하기위한 트릭이 있습니까? WPF Toolkit Datagrid (Windows XP에서 WPF 3.5 사용)를 처음 사용하면서 동일한 문제가 발생하여 데이터 표시 (그리고 버전이 전혀 필요하지 않음)가 필요하므로 "구식"ListView 내부 GridView ... 아무런 영향이 IMHO ..

감사!

편집 1 : 그것은 ... 전에 작성 예는 내가 아니라 문자열을 결합하는 것을 고려 ... 그냥 "간단한"목록 나는 WPF의 GridView 성능 가능성의 최대에 도달 한 것 같다하지만, 사전과 복잡한 구조. 또한이 WPF 응용 프로그램은 모두 VSTO 추가 기능에 의해 시작되는 클래스 라이브러리입니다.

결론 : gridview는 그대로 사용할 수 없으며 가상화를 비활성화하면 22 초 안에로드됩니다.

내 WPF 창에 WinForm DataGridView를 사용해야 할 것 같습니다.이 문제를 사용하여 문제를 해결할 수 있다고 생각하십니까?

+0

내 PC에서 VirtualView의 VirtualizationStackPanel.IsVirtualizing = "True"로 설정하면 1 초 안에로드됩니다. VirtualizingStackPanel.IsVirtualizing = "False"는 6-8 초가 걸립니다. 왜 그렇게 많은 행과 열을 원하십니까? 어떤 종류의 데이터입니까? – publicgk

+0

열은 동적으로 생성됩니다 (한 열 = 1 년). 그리고 그것은 "비교"표입니다 (각 열에는 전후 2 개의 하위 열이 있습니다). 행은 내가 말할 수없는 것이지만 데이터가 무엇이든간에 (일부 문자열로 테스트 한) 문제는 여전히 동일하게 유지됩니다. VirtualizingStackPanel.IsVirtualizing = "True"로 시도한 경우 수직 스크롤이 매우 느린 곳에서 느껴졌습니까? – metalcam

+0

은 약간 느리지 만 허용됩니다. 당신의 PC는 꽤 오래 되었습니까? – publicgk

답변

0

GridView가 문제가되지 않았습니까? 노인 프로젝트에서 거대한 GridViews (최대 100 개의 열)를 문제없이 시각화 한 것을 기억합니다.
DataTemplate에서 바인딩을 제거하고 바인딩과 함께 느린 경우 시도하십시오. 그렇지 않은 경우 문제는 소스 객체의 ToString() 메서드에 있습니다.

<DataTemplate x:Key="myCellTemplateMonth"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition/> 
       <ColumnDefinition/> 
      </Grid.ColumnDefinitions> 
      <Border Grid.Column="0" BorderThickness="1,0,1,1" SnapsToDevicePixels="True" BorderBrush="Black" Margin="-6,0,-6,0"> 
       <TextBlock Grid.Column="0" Text="Test withouth binding"/> 
      </Border> 
      <Border Grid.Column="1" BorderThickness="1,0,1,1" SnapsToDevicePixels="True" BorderBrush="Black" Margin="-6,0,-6,0"> 
       <TextBlock Grid.Column="0" Text="Test withouth binding"/> 
      </Border> 
     </Grid> 
    </DataTemplate> 
+0

대신''를 시도했습니다. 조금 느리지 만 올바르게 사용할 수는 없습니다. ( – metalcam