2011-07-01 101 views
1

**請查看更新下面WPF數據網格渲染性能(自電網控制)

我想在我的WPF應用程序中使用一個DataGrid的問題,但我發現的性能是無法忍受的。

我綁定到只有100行和15列的數據集和任何類型的滾動或甚至列寬調整大小繪製極其緩慢。

我記得舊的winforms datagridview在單元格邊框打開時表現不佳,但關閉它的wpf對應網格線沒有任何效果。

與電網的窗口:

<Window x:Class="GridPerformanceTest.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="True" EnableColumnVirtualization="True" EnableRowVirtualization="True" 
       VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" Background="{x:Null}" 
       BorderBrush="{x:Null}" IsSynchronizedWithCurrentItem="False" BorderThickness="0" RowHeight="15" 
       GridLinesVisibility="None" HorizontalGridLinesBrush="{x:Null}" VerticalGridLinesBrush="{x:Null}" ColumnHeaderHeight="15"/> 
</Grid> 

如何,我填充我的數據:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     DataSource source = new DataSource(); 

     DataSet ds = new DataSet(); 
     ds.Tables.Add(source.Execute("select * from tbl_users")); 

     this.DataContext = ds.Tables[0]; 
    } 
} 

編輯:

,因爲我有沒有運氣與datagrid,我敢肯定它有更多的功能比我現在正在尋找的(簡單地顯示簡單文本和選擇數據複製/粘貼)我決定嘗試自己的工作。

這將是我在自定義用戶控件上的第一個鏡頭,但我已經找到性能差的來源......電網。

如果我爲包含我的行數據的列和堆疊面板編寫一個包含網格分隔符的控件,滾動行是完美的 - 就像我習慣於使用良好的ol XML數據網格一樣。

Grid控件代碼:

public partial class CustomGridControl : UserControl 
{ 
    public CustomGridControl() 
    { 
     InitializeComponent(); 

     for (int i = 0; i < 20; i++) 
     { 
      ColumnDefinition col = new ColumnDefinition(); 
      col.Width = new GridLength(75); 
      _rootGrid.ColumnDefinitions.Add(col); 

      StackPanel pnl = new StackPanel(); 
      pnl.Orientation = Orientation.Vertical; 

      for (int x = 0; x < 1000; x++) 
      { 
       TextBlock blk = new TextBlock(); 
       blk.Foreground = Brushes.Black; 
       blk.Text = "Row: " + x.ToString() + " Col: " + i.ToString(); 

       pnl.Children.Add(blk); 
      } 

      Grid.SetColumn(pnl, i); 
      _rootGrid.Children.Add(pnl); 

      GridSplitter splitter = new GridSplitter(); 
      splitter.Width = 2; 
      splitter.BorderBrush = Brushes.Black; 

      Grid.SetColumn(splitter, i); 
      Grid.SetRowSpan(splitter, 1000); 

      _rootGrid.Children.Add(splitter); 

     } 
    } 

而XAML:

<UserControl x:Class="CustomGrid.CustomGridControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 

<Grid > 
    <ScrollViewer> 
     <Grid x:Name="_rootGrid" Background="Aqua"/> 
    </ScrollViewer> 
</Grid> 

當我嘗試並拖動分離器之一,性能是可怕的,就像用標準WPF數據網格。

現在我知道我沒有進行任何虛擬化來優化性能或者其他任何東西,但是stackpanels的性能仍然可以輕鬆達到100倍。

更新我的問題 - 我想知道如果任何人有任何想法如何處理另一種類型的面板,將允許相同的分欄類型功能的列。

任何自定義面板/網格的良好鏈接也將不勝感激。

+1

你的問題是什麼?沒有辦法加速Microsoft DataGrid,這是可怕的表現。你在問什麼是好的選擇? –

+0

嗯,我希望加快數據網格,實際上:p什麼是一個好的選擇?我嘗試過使用gridview,性能稍微好一點 - 我感覺好像有些東西或某些設置是錯誤的,因爲與良好的'ol winforms的datagridview相比,這些控件幾乎不可用。 – ChandlerPelhams

+0

我不知道如何加快Microsoft DataGrid的速度。與其他一些公司一樣,Exceed的速度要快得多。如果你不需要寫數據,ListView/GridView的速度會更快(10-20倍)。 –

回答

1

如建議here,通過設置'EnableRowVirtualization'和'EnableColumnVirtualization',而不是VirtualizingStackPanel.*屬性,可以獲得一些性能改進。

您還可以通過設置固定的列寬來改進它。