2011-05-12 19 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(我使用WPF 3.5与Windows XP),并且我得到了同样的问题,所以我只想显示数据(并且根本没有版本),我回到了“老式”的ListView与GridView里面...没有效果恕我直言......

谢谢!

编辑1:看来,我已经达到了最大的WPF GridView的表现可能性... 之前写的例子只是一个“简单”的名单......想想看,我绑定不只是字符串,但一本字典和一个复杂的结构。 此外,所有此WPF应用程序都是由VSTO插件启动的类库。

结论:gridview是不可用的,因为...并且在我禁用虚拟化时在22秒内加载。

看来,我将不得不使用一个WinForm的DataGridView到我的WPF窗口......你认为这个问题可以用这个解决吗?

+0

在我的PC上,ListView上的VirtualizingStackPanel.IsVirtualizing =“True”使它在1秒内加载。 VirtualizingStackPanel.IsVirtualizing =“False”需要6-8秒。顺便说一句,你为什么要这么多的行和列?它是什么样的数据? – publicgk 2011-05-12 08:32:21

+0

动态生成列(一列=一年),它是一个“比较”表(每列有2个子列 - 之前/之后)。 行是我不能告诉你的东西,但无论数据是什么(我用一些字符串测试),问题仍然保持不变。 当您尝试使用VirtualizingStackPanel.IsVirtualizing =“True”时,您是否觉得垂直滚动非常缓慢? – metalcam 2011-05-12 09:17:40

+0

只有轻微的缓慢(可以接受),但不是极端。你的电脑比较老吗? – publicgk 2011-05-12 10:46:44

回答

0

你确定GridView是问题吗?我记得从一个更老的项目中,我已经可视化了大量的GridView(最多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 2011-05-12 08:30:58

相关问题