2011-05-12 20 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

相關問題