wpf datagrid渲染性能(自定义网格控件)

**请参阅下面的问题更新

我想在我的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 datagrid”一样。

网格控制代码:

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倍。

要更新我的问题 - 我想知道是否任何人有任何想法如何处理另一种类型的面板中的列,这将允许相同的分栏类型功能的列。

任何自定义面板/网格的良好链接也将非常感谢。


如此处所示,通过设置“EnableRowVirtualization”和“EnableColumnVirtualization”,而不是VirtualizingStackPanel.*属性,可以获得性能提升。

您也可以通过设置固定列宽来改进它。

链接地址: http://www.djcxy.com/p/64727.html

上一篇: wpf datagrid render performance (custom grid control)

下一篇: WPF combine two collections in one DataGrid