我遇到了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窗口......你認爲這個問題可以用這個解決嗎?
在我的PC上,ListView上的VirtualizingStackPanel.IsVirtualizing =「True」使它在1秒內加載。 VirtualizingStackPanel.IsVirtualizing =「False」需要6-8秒。順便說一句,你爲什麼要這麼多的行和列?它是什麼樣的數據? – publicgk 2011-05-12 08:32:21
動態生成列(一列=一年),它是一個「比較」表(每列有2個子列 - 之前/之後)。 行是我不能告訴你的東西,但無論數據是什麼(我用一些字符串測試),問題仍然保持不變。 當您嘗試使用VirtualizingStackPanel.IsVirtualizing =「True」時,您是否覺得垂直滾動非常緩慢? – metalcam 2011-05-12 09:17:40
只有輕微的緩慢(可以接受),但不是極端。你的電腦比較老嗎? – publicgk 2011-05-12 10:46:44