我的WPF DataGrid(.net 4.0)存在性能问题
首先,一些细节:
我这样做的原因是因为我只在运行时知道我在dataGrid中会有多少列。
现在我遇到的麻烦是我还必须能够在应用程序运行时随时更改任何单元格的属性(如Background,Foreground,FontFamily等等)。
我想出的解决方案是将列的'cellStyles设置为绑定到“逻辑”单元格属性的绑定
这是一个示例代码(我的应用程序中没有Xaml):
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Width = 1200;
Height = 780;
Top = 60;
Left = 200;
DataGrid dg = new DataGrid();
Content = dg;
ObservableCollection<Row> Source = new ObservableCollection<Row>();
dg.ItemsSource = Source;
dg.SelectionMode = DataGridSelectionMode.Extended;
dg.IsSynchronizedWithCurrentItem = true;
dg.CanUserSortColumns = false;
dg.CanUserReorderColumns = true;
dg.CanUserResizeColumns = true;
dg.CanUserResizeRows = true;
dg.CanUserAddRows = false;
dg.CanUserDeleteRows = false;
dg.AutoGenerateColumns = false;
dg.EnableColumnVirtualization = true;
dg.EnableRowVirtualization = false; // unuseful in my case : I alawys have less lines than the DG can contain
dg.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
dg.GridLinesVisibility = DataGridGridLinesVisibility.None;
dg.HorizontalGridLinesBrush = Brushes.LightGray;
dg.MinRowHeight = 20;
dg.RowHeaderWidth = 20;
for (int i = 0; i < 100; i++)
{
DataGridTextColumn column = new DataGridTextColumn();
column.Binding = new Binding(String.Format(CultureInfo.InvariantCulture, "[{0}].Text", i));
Style style = new Style(typeof(DataGridCell));
style.Setters.Add(new Setter(DataGridCell.BackgroundProperty, new Binding(String.Format(CultureInfo.InvariantCulture, "[{0}].Background", i))));
style.Setters.Add(new Setter(DataGridCell.ForegroundProperty, new Binding(String.Format(CultureInfo.InvariantCulture, "[{0}].Foreground", i))));
column.CellStyle = style;
column.Header = "Column " + i;
dg.Columns.Add(column);
}
for (int i = 0; i < 35; i++)
{
Row dgRow = new Row();
Source.Add(dgRow);
for (int j = 0; j < 100; j++)
dgRow.Add(new TextBox() { Text = "cell " + i + "/" + j, Background = Brushes.AliceBlue, Foreground = Brushes.BlueViolet });
}
}
}
public class Row : ObservableCollection<TextBox>
{
}
我的问题是:使用VolumnVirtualisation On(在我的情况下我不需要行虚拟化),网格需要大约2秒加载,然后每次移动水平滚动条大幅跳跃1秒(clic in the scrollBar bg,而不是箭头)
这对我来说太过分了
所以我的问题是:我做错了什么,如果有,是什么?我有什么更好的方法吗?
感谢阅读
答案 0 :(得分:1)
如果ColumnVirtualization出现问题,为什么还需要它? 你可以做一些改进,但他们无法完全解决问题。
更改轻量级对象的TextBox:
public class TextItem
{
public string Text { get; set; }
public Brush Background { get; set; }
public Brush Foreground { get; set; }
}
public class Row : ObservableCollection<TextItem>
{
}
启用VirtualizingStackPanel:dg.SetValue(VirtualizingStackPanel.IsVirtualizingProperty, true);
用模板替换样式:
for (int i = 0; i < 100; i++)
{
DataGridTemplateColumn column = new DataGridTemplateColumn();
column.CellTemplate = (DataTemplate)XamlReader.Parse(
"<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>" +
"<TextBlock DataContext='{Binding [" + i + "]}' Text='{Binding Text}' Background='{Binding Background}' Foreground='{Binding Foreground}'/>" +
"</DataTemplate>");
column.Header = "Column " + i;
dg.Columns.Add(column);
}
答案 1 :(得分:0)
经过大量的时间投入,我得出结论,我已达到极限。
以下是处理同一问题的人的一些想法:
从.net 4.0开始,没有简单的方法可以在WPF中管理单个单元格的视觉属性:MS没有计划任何事情来简化这一点,所以基本上你有两种可能性来做到这一点:
如果像我一样你别无选择,只能使用第二种选择(因为我需要虚拟化),这里有几点需要考虑:
如果有人要添加任何内容,请执行此操作!我仍然在寻找可以改善现状的任何想法,并且对于你对这个主题的任何疯狂想法感到高兴。即使在3个月内......