WPF DataGrid 加载时间不合理

2024-03-08

我的 WPF DataGrids 加载时间总是很长,而且我在网上找不到任何类似的报告,所以我怀疑我做错了什么。现在我确信这一点,因为增加布局复杂性会大大减慢执行速度。在非常简单的布局中,DataGrid 会立即填充,而下面的代码大约需要 3 秒才能执行。

在以下代码中,即使每个单元格未绑定到任何属性并且 AutoGenerateColumns=False,加载 150 行和 11 列也需要约 3 秒的时间。 (我有一个两核 2.6GHz 处理器,有足够的 RAM)。

当 ItemsSource 属性在布局中设置如下时,就会出现瓶颈:

<Window x:Class="datagridtest.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">
<Border  Background="LightSteelBlue" CornerRadius="10" Margin="10">
    <ScrollViewer Margin="10" HorizontalScrollBarVisibility="Auto">
        <Grid Margin="10,50,0,0">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"  />
                <RowDefinition Height="auto" />
                <RowDefinition Height="auto" />

            </Grid.RowDefinitions>
            <Expander IsExpanded="True" Name="expander1"  Grid.Row="0">
                <Grid>
                    <DataGrid VirtualizingStackPanel.IsVirtualizing="True" AutoGenerateColumns="false" Name="dg" Height="auto" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserSortColumns="False">
                        <DataGrid.Columns>
                            <DataGridTextColumn >
                                <DataGridTextColumn.Header >
                                    <TextBlock Width="140" HorizontalAlignment="Center" TextAlignment="Center">untitled<LineBreak/>column</TextBlock>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>



                            <DataGridTextColumn >
                                <DataGridTextColumn.Header >
                                    <TextBlock Width="140" HorizontalAlignment="Center" TextAlignment="Center">untitled<LineBreak/>column</TextBlock>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>

                            <DataGridTextColumn >
                                <DataGridTextColumn.Header >
                                    <TextBlock Width="140" HorizontalAlignment="Center" TextAlignment="Center">untitled<LineBreak/>column</TextBlock>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>

                            <DataGridTextColumn >
                                <DataGridTextColumn.Header >
                                    <TextBlock Width="140" HorizontalAlignment="Center" TextAlignment="Center">untitled<LineBreak/>column</TextBlock>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>

                            <DataGridTextColumn >
                                <DataGridTextColumn.Header >
                                    <TextBlock Width="140" HorizontalAlignment="Center" TextAlignment="Center">untitled<LineBreak/>column</TextBlock>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>


                            <DataGridTextColumn >
                                <DataGridTextColumn.Header >
                                    <TextBlock Width="140" HorizontalAlignment="Center" TextAlignment="Center">untitled<LineBreak/>column</TextBlock>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>

                            <DataGridTextColumn >
                                <DataGridTextColumn.Header >
                                    <TextBlock Width="140" HorizontalAlignment="Center" TextAlignment="Center">untitled<LineBreak/>column</TextBlock>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>

                            <DataGridTextColumn >
                                <DataGridTextColumn.Header >
                                    <TextBlock Width="140" HorizontalAlignment="Center" TextAlignment="Center">untitled<LineBreak/>column</TextBlock>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>

                            <DataGridTextColumn >
                                <DataGridTextColumn.Header >
                                    <TextBlock Width="140" HorizontalAlignment="Center" TextAlignment="Center">untitled<LineBreak/>column</TextBlock>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>

                            <DataGridTextColumn >
                                <DataGridTextColumn.Header >
                                    <TextBlock Width="140" HorizontalAlignment="Center" TextAlignment="Center">untitled<LineBreak/>column</TextBlock>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>

                            <DataGridTextColumn >
                                <DataGridTextColumn.Header >
                                    <TextBlock Width="140" HorizontalAlignment="Center" TextAlignment="Center">untitled<LineBreak/>column</TextBlock>
                                </DataGridTextColumn.Header>
                            </DataGridTextColumn>



                        </DataGrid.Columns>
                        </DataGrid>
                </Grid>
            </Expander>

            <Expander IsExpanded="true"  Grid.Row="1">
                <Grid>
                    <DataGrid AutoGenerateColumns="True"  Height="auto" />
                </Grid>
            </Expander>

            <Expander IsExpanded="true"    Grid.Row="2">
                <Grid>
                    <DataGrid AutoGenerateColumns="True" Height="auto" />
                </Grid>
            </Expander>
            <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="121,-42,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click_2" />
        </Grid>
    </ScrollViewer>
</Border>
using System.Collections.ObjectModel;

namespace datagridtest
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();


    }

    class row
    {
        public string Name { get; set; }
        public double Age { get; set; }
    }



    private void button1_Click_2(object sender, RoutedEventArgs e)
    {
        ObservableCollection<row> src = new ObservableCollection<row>();

        for (int i = 0; i < 150; i++)
            src.Add(new row { Name = i.ToString(), Age = i / 2 });

        dg.ItemsSource = src;
    }
}
}

仅当 DataGrid 嵌入 ScrollViewer 中时才会出现此问题,如下所示:

<ScrollViewer>
    <Datagrid/>
</ScrollViewer>

这是有道理的,因为此配置会导致同时绘制整个 DataGrid(以便能够正确调整 ScrollViewer 的工作区大小)。本质上,它覆盖了 DataGrid 的内置虚拟化行为,DataGrid 实现了自己的 ScrollBar,因此不必将其所有内容同时放置在布局中。

换句话说,很少需要在 ScrollViewer 中嵌入 DataGrid,因为 DataGrid 有自己的自动滚动功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF DataGrid 加载时间不合理 的相关文章

随机推荐

  • OSMDroid 从资产文件夹加载自定义离线图块

    我想知道是否可以做这样的事情 我知道需要修改一些现有代码才能实现这一目标 但我想知道是否有人知道在哪里查看以及如何执行此操作 我在地图上的特定区域放置了一些自定义图块 作为 OSM 图块提供程序的替代品 但需要将它们存储在 assets 文
  • 将 JSON 转换为 Python 对象:如何处理 DateTime 转换?

    我有一个 C 控制台应用程序 可将 POCO 类序列化为 JSON 字符串 我使用 JSON Net 进行序列化 此应用程序中的 JSON 被转储到文件中 并由 Python 2 7 脚本读入 问题就在这里 JSON 序列化获取我的类上的所
  • 如何使用curl和PHP设置自定义请求标头键?

    我使用curl 和php 上传文件 我需要帮助来设置自定义请求标头键 例如 X Filename blahblah zip X Filesize 2677 X Filetype application zip 您必须使用curl setop
  • 如何修改 OpenXML TableCell 的前景色和背景色?

    我正在创建表格单元格 如下所示 private static TableCell GetHeaderCell string cellText var tc new TableCell new Paragraph new Run new Te
  • 如何将对象排序到存储桶中表示为有效的 JPQL 表达式?

    我想显示一个 2D 图表 其中包含给定时间跨度内处理的对象数量 映射在 JPA 中 在 30 分钟的时间内 这个数量可以扩展到大约 30k 个对象 作为一名 DBMS 我在 4 2 21 版中使用 PostgreSQL 9 4 和 JPA
  • 为什么我不需要在 C++20 中的依赖类型之前指定“typename”?

    这段代码在 C 20 中编译 使用 gcc 10 1 没有使用typename依赖类型之前的关键字std vector
  • Docker - eclipse-mosquitto:2.0.7 错误:地址不可用

    我正在尝试在 Windows 10 中将 mosquitto 作为 docker 容器运行 下面出现错误日志地址不可用 1614449526 mosquitto version 2 0 7 starting 1614449526 Confi
  • Firefox 开发者版缺少添加监视功能

    更新到 52 0a2 后 我无法在 javascript 调试器中创建自己的表达式 添加监视等 当我右键单击某个变量时 我过去只是从上下文菜单中选择 添加文本到监视表达式 但在最新版本中它丢失了 我必须启用某些功能吗 thanks The
  • 创建一个倒计时器,每 5 秒打印一次列表中每个值的剩余时间

    我正在尝试在 Flutter 中创建一个倒计时器来打印剩余时间每 5 秒直到计时器用完 然后为值列表中的下一个值运行相同的倒计时器 下面的递归函数接近 但它在转到下一个值之前等待 迭代 List即使剩下的时间越来越少Timer import
  • 将文本字段添加到 SKScene

    我正在使用 Sprite Kit 创建一个游戏 我想添加一个文本字段供玩家输入他们的名字 如何使用 Sprite Kit 创建文本字段 我将创建一个玩家对象 我已经设置了 并使用他们输入的名称和默认分数 0 混合 UITextfields
  • 来自 GET/POST 的 Rails 参数

    我对 Rails 相当陌生 正在编写一个登录表单 我使用 form tag 将用户的提交传递给帐户控制器 现在 我不希望用户能够通过 GET 请求输入其登录详细信息 那么如何检查某个参数是 GET 还是 POST 参数 提前致谢 在 Rai
  • Google API 将请求从 Android 应用发送到 google plus

    我正在开发一款安卓应用程序 众所周知 Facebook SDK 提供了使用请求对话框向其他用户发送请求的功能 https developers facebook com docs android send requests https de
  • Spring Boot - 自定义 JSON 序列化 [重复]

    这个问题在这里已经有答案了 在使用 Jackson 库时 我通常使用 mixin 来执行自定义序列化和反序列化 Spring Boot 应用程序中的 RestController 具有类似于下面列出的方法 我猜 Spring Boot 使用
  • app.post() 不适用于 Express

    我遇到 Express 问题 我尝试使用 app post 函数 但它不起作用 我不知道为什么 虽然我包括了 bodyParser 问题 页面加载没有响应 没有错误消息 我没有看到 console log app js var expres
  • 升级TortoiseSVN 1.8问题

    我升级了乌龟SVN http en wikipedia org wiki TortoiseSVNWindows XP 上从 1 7 12 升级到 1 8 之后它要求升级SVN格式 我尝试升级 但它一直询问并且命令没有产生错误 我尝试从服务器
  • 对于定义为 0 的宏,#ifdef 和 #if 之间的细微差别

    给定以下 C 文件 cat macros c ifdef MACRO error MACRO is defined else error MACRO is undefined endif if MACRO error MACRO is no
  • 私有内部类综合了意想不到的匿名类

    当您编译带有私有 内部类的 Java 类时 由于某种原因 似乎会自动合成一个匿名类 这个类足以重现它 public class SynthesizeAnonymous public static void method new InnerC
  • 具有最佳实践的示例 N 层 ASP.NET MVC3 应用程序(使用 EF 4.1)

    我正在寻找一个演示最佳实践的示例 ASP NET MVC3 N 层应用程序 首先使用域驱动设计和实体框架 4 1 代码 我发现了以下内容 您推荐其中哪一个 或此列表中没有的其他任何一个 http efmvc codeplex com htt
  • 链接 jQuery 动画

    我已经编写了将动画链接在一起的代码 即向左移动 然后向右移动 我有20个 li 标签排列在网格中 我正在为主要动画 ul 移动所需的 li 进入视野 Code x 和 y 是坐标 多快设置为 1200 easeItIn 设置为 easeOu
  • WPF DataGrid 加载时间不合理

    我的 WPF DataGrids 加载时间总是很长 而且我在网上找不到任何类似的报告 所以我怀疑我做错了什么 现在我确信这一点 因为增加布局复杂性会大大减慢执行速度 在非常简单的布局中 DataGrid 会立即填充 而下面的代码大约需要 3