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 加载时间不合理 的相关文章

  • 为单个方法引用大 DLL

    我想在 C 中使用大型类库 dll 中的单个方法 是否有性能或其他方面的缺点 我应该使用反射工具 读取 方法代码并将其复制粘贴到我的项目中吗 更新 硬盘空间不是问题 我的应用程序是网络应用程序 是否有性能或其他方面的缺点 唯一真正重要的是可
  • WPF MVVM将DataTable绑定到DataGrid不显示数据

    我有一个简单的控件 其中包含一个 DataGrid 其中 ItemsSource 绑定到 DataTable 当我填充 DataTable 时 我可以看到 DataGrid 中添加了行 但没有显示任何数据 我没有为此 DataGrid 使用
  • java charAt() 和startsWith() 哪个更快? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我的问题是 如果我想检查特定索引中字符串的一个字符 仅检查一个字符 哪种方法非常有效charAt or startsWith 我的意思是 据我所
  • 如何从 WPF 窗口显示 Winforms 对话框?

    这个问题的反面已经被回答过很多次了 public static void SetOwner object activeWindow object dialog if IsWindow dialog IsWindow activeWindow
  • Java 9:AES-GCM 性能

    我进行了一个简单的测试来测量AES GCM https en wikipedia org wiki Galois Counter Mode表现在Java 9 通过在循环中加密字节缓冲区 结果有些令人困惑 本机 硬件 加速似乎有效 但并非总是
  • WPF:窗口设置边界

    我在 Windows Forms 中使用 SetBounds 方法而不是 Left Top Width Height 属性分配 因为每次我分配更改位置属性的值时 窗口都会更改其位置 Left Top Width Height 赋值导致窗口移
  • 专家 C#/.Net/WPF 开发人员应该了解哪些知识? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 中继命令和无参数执行方法

    我目前正在学习 WPF 和 MVVM 我想我已经了解了大部分内容及其工作原理 但我在使用 RelayCommand 或 DelegateCommand 时遇到了一些我不明白的问题 我认为这与代表的工作方式有关 请注意 下面的代码目前仅处于测
  • 渲染 ThreeJS 应用程序第一帧时的性能问题

    目前 当我渲染以下内容时 我的 ThreeJS 应用程序的性能受到很大影响第一帧 它会导致 Edge 和 IE 11 浏览器冻结 5 秒 并弹出窗口指示 此窗口没有响应 这可能会吓到我的用户 使用 Chrome 的性能分析器 问题似乎来自几
  • R:使用带有 .Call 和 C/C++ 包装器的 Fortran 子例程而不是 .Fortran 的优点?

    我有一个 R 包 它使用大量 Fortran 子例程来进行递归线性代数计算的嵌套循环 很大程度上依赖于 BLAS 和 LAPACK 例程 作为 Fortran 的接口 我使用 Fortran功能 我刚刚读过乔纳森卡拉汉的博客文章 http
  • 有效地生成所有排列

    我需要尽快生成所有排列 https en wikipedia org wiki Permutation整数的0 1 2 n 1并得到结果作为NumPy https numpy org 形状数组 factorial n n 或者迭代此类数组的
  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • 与 wpf ComboBox DisplayMemberPath、SelectedValue 和 SelectedValuePath 混淆

    我一直在努力解决这些组合框属性 显示成员路径 选定值 选定的值路径 我正在构建一个主详细信息表单 组合框中充满了客户 用户在组合中选择客户 所有文本框 EG 均正确填写 我遇到的问题是我已经让它工作了 但我不理解这些属性和差异 有没有一个很
  • 如何在 WPF 应用程序中实现气球消息

    我们想使用气球消息 如UX Guide http msdn microsoft com en us library aa511451 aspx来自微软 我发现一些示例使用 Windows 窗体中的本机代码 但本机代码需要组件的句柄 这对于
  • C# 中单个 & 符号的第二个含义是什么?

    我在 C 中使用了单个与号 来表示 检查second条件语句即使第一个是false 但以下似乎是不同的意思 of 总而言之 谁能解释一下如何i 1在下面的例子中有效吗 List
  • SQL Server 不使用索引将日期时间与非空进行比较

    我有一个与其他任何表都不相关的简单表 它有一个非 PK 列 它是一个日期 我已经为该列创建了一个非聚集索引 如果我提出这个查询 select from table where datecolumn is not null 但如果我删除 no
  • 树视图上下文菜单命令未触发

    我有一个绑定到某些属性类型的 Observable 集合的树视图 有一个 HierarchicalDataTemplate 在树视图中显示数据 现在我需要显示每个 HierarchicalDataTemplate 项目的特定上下文菜单 我使
  • 将数据从一个线程传递到另一个线程的最快可能方法

    我正在使用增强spsc queue将我的东西从一个线程移动到另一个线程 这是我的软件中的关键位置之一 所以我想尽快完成它 我写了这个测试程序 include
  • Python——捕获异常的效率[重复]

    这个问题在这里已经有答案了 可能的重复 Python 常见问题解答 异常有多快 https stackoverflow com questions 8107695 python faq how fast are exceptions 我记得
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack

随机推荐

  • 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