【发布时间】:2011-09-26 23:45:30
【问题描述】:
**请查看以下问题的更新
我正在尝试在我的 WPF 应用程序中使用数据网格,但我发现性能难以忍受。
我正在绑定到一个只有 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];
}
}
编辑:
所以因为我对数据网格没有运气,我确信它比我现在正在寻找的功能更多(只需显示纯文本并选择数据进行复制/粘贴)我决定尝试工作靠我自己。
这将是我对自定义用户控件的第一次尝试,但我已经找到了性能不佳的根源……网格。
如果我为包含我的行数据的列和堆栈面板编写一个带有网格拆分器的控件,则滚动行是完美的——就像我习惯于使用良好的 'ol winforms 数据网格一样。
网格控制代码:
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 数据网格一样。
现在我知道我并没有进行任何虚拟化来优化性能或其他任何事情,但堆栈面板的性能仍然轻松提高 100 倍。
更新我的问题 - 我想知道是否有人对如何处理另一种类型的面板中的列有任何想法,这将允许列的相同 gridsplitter 类型功能。
任何指向自定义面板/网格的良好链接也将不胜感激。
【问题讨论】:
-
你有什么问题?没有办法加快 Microsoft DataGrid 的速度,是的,它的性能很糟糕。您是在问什么是好的选择?
-
好吧,我希望加快数据网格的速度,实际上 :p 什么是好的选择?我已经尝试使用 gridview 并且性能稍微好一些 - 我觉得某些东西或某些设置是错误的,因为与来自好的 'ol winforms 的 datagridview 相比,这些控件几乎无法使用。
-
我不知道加快 Microsoft DataGrid 的速度。与其他一些公司一样,Exceed 的速度要快得多。如果您不需要写入数据,ListView/GridView 会快很多(10-20 倍)。
-
我尝试使用 listview/gridview 并注意到一些性能提升,但我仍然觉得这是不可接受的。在我移动滚动条和滚动发生之间仍然存在延迟。此外,当调整窗口大小(网格设置为拉伸到窗口大小)时,仍然需要整整一秒半的时间来绘制。这是我第一次尝试 WPF,我不明白如何将它与与 winforms 网格相比性能如此差的网格一起使用。
-
ListView/GridView 一秒半?这听起来不对。你要添加多少项目?如果它是数千个,您要确保它是虚拟化的。
标签: wpf performance datagrid controls