我的ListView / GridView出现问题。 事实上,我的网格有285行,动态构建了24列。
我的网格速度太慢,于是我决定直接在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>
您可以在每列中看到“双列”样式(带有一点图形错误,但不要注意这个事实)。
这里的主要问题是网格的慢速,它显然不能用作专业网格...... 我试图激活虚拟化并禁用它(当虚拟化被禁用时,加载网格大约需要17-18秒......)
是否有一些技巧可以实现高速网格或者我做错了什么? 我第一次使用WPF Toolkit Datagrid(我在Windows XP中使用WPF 3.5),我遇到了同样的问题,因为我只想显示数据(根本没有版本),我回到了“老式”ListView里面的GridView ......没有效果恕我直言..
谢谢!
编辑1:似乎我达到了WPF GridView性能的最大可能性...... 之前编写的示例只是一个“简单”列表...考虑到我不仅绑定字符串而且绑定字典和复杂结构。 此外,所有这个WPF应用程序都是一个类库,由VSTO加载项启动。
结论:gridview无法使用...并且在禁用虚拟化时会在22秒内加载。
似乎我必须在我的WPF窗口中使用WinForm DataGridView ......您认为问题可以用这个来解决吗?
答案 0 :(得分: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>