【问题标题】:GridView in ListView with high number of rows, columns and cell templates具有大量行、列和单元格模板的 ListView 中的 GridView
【发布时间】:2011-05-12 08:13:24
【问题描述】:

我的 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...你认为使用这个可以解决问题吗?

【问题讨论】:

  • 在我的 PC 上,ListView 上的 VirtualizingStackPanel.IsVirtualizing="True" 使其在 1 秒内加载。 VirtualizingStackPanel.IsVirtualizing="False" 需要 6-8 秒。顺便说一句,你为什么想要这么多行和列?它是什么样的数据?
  • 列是动态生成的(一列 = 一年),它是一个“比较”表(对于每一列,有 2 个子列 - 之前/之后)。行是我无法告诉你的,但无论数据是什么(我用一些字符串进行了测试),问题仍然是一样的。当您尝试使用 VirtualizingStackPanel.IsVirtualizing="True" 时,您是否觉得垂直滚动非常慢?
  • 只有一点点慢(可以接受)但不是非常慢。你的电脑很旧吗?
  • 奔腾 4 2.80 Ghz,3GM RAM,Windows XP SP3。这里的问题是我的应用程序将部署在不如我强大的计算机上,所以它至少是一样的,甚至是最糟糕的!
  • 我修改了我的初始帖子...

标签: wpf xaml listview gridview celltemplate


【解决方案1】:

您确定 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>

【讨论】:

  • 我尝试改用&lt;TextBlock Grid.Column="0" Text="ok"/&gt;。它只是慢了一点,但仍然不能正确使用:(
猜你喜欢
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多