【问题标题】:how do I make my application as fast as windows explorer for rendering files如何使我的应用程序与渲染文件的 Windows 资源管理器一样快
【发布时间】:2011-04-04 08:22:59
【问题描述】:

我有一个文件夹,里面有大量文件。我希望能够将我的每个文件呈现为一个按钮。当我点击按钮时,会发生一些事情。

 private void Form1_Load(object sender, EventArgs e)
    {
        int x = 10; 
        int y = 10;

        /// Process the list of files found in the directory.
        string[] fileEntries = Directory.GetFiles(@"c:\lotsofDocs");
        foreach (string fileName in fileEntries)
        {
            // do something with fileName
            Button newbotton = new Button();
            newbotton.AutoSize = true;
            newbotton.Text = fileName;
            panel1.Controls.Add(newbotton);
            newbotton.Location = new Point(x, y);
            x += 150;
            if (x == 760)
            {
                y += 50;
                x = 10;
            }
        }

如您所见,代码中没有任何疯狂之处。我在表单上有一个面板,我已将面板上的自动滚动设置为 true,将自动大小设置为 false。这会导致表单保持大小和按钮(其中一些)从表单呈现出来,我可以向下滚动到它们。

到目前为止一切顺利。

如果我有 100 或 200 个文件,一切正常,如果我有 1932 个文件,渲染所有按钮大约需要 10 秒。

我已阅读以下问题Super slow C# custom control 并且我知道我使用的方法可能不是最好的方法。

现在问题终于来了: Windows 资源管理器如何处理这个问题?如果我在 Windows 资源管理器中打开此文件夹,它会立即打开。 Windows 资源管理器使用什么类型的控件?还是它以与我完全不同的方式做到这一点。

谢谢

【问题讨论】:

  • 为什么不“像 Chrome 一样快”? youtube.com/watch?v=4viKjxJqId0
  • 我怀疑 Windows Explorer 是否在使用 .NET。它对系统的影响更深,并且多年来经过多次迭代进行了优化。
  • @Hamish Grubijan... Windows“桌面”资源管理器,而不是 Windows“Internet”资源管理器! (顺便说一下可怕的照片)。
  • 谢谢,你自己长得不好看。
  • 他们在哪里测试 Chrome“前进”按钮的速度?是的,现在这是我最关心的浏览问题。

标签: c# windows optimization explorer


【解决方案1】:

很长的控件列表通常通过虚拟化控件实现。这意味着如果屏幕上只有 20 个按钮,它只会创建 20 个左右的按钮。当您滚动时,它会重复使用相同的 20 个按钮,其中包含新数据。

创建和管理大量控件可能会非常缓慢,因为它们通常被添加到一个简单的列表或层次结构中(并且单独相当复杂)。

最好自己管理一组较小的按钮来显示很长的数据列表。显然更多的工作,但与“简单方法”相比,最终结果快如闪电。

如果你不想DIY,试试第三方控制。例如,Telerik 虚拟化的 TreeListGrid 控件可以显示一百万条记录而不会减慢速度。 Take a look at their Winforms grid here

【讨论】:

    【解决方案2】:

    您应该查看ListView。它提供与 Windows 资源管理器中的文件区域相同的基本功能集,并具有相当的性能。

    确保在添加项目之前致电BeginUpdate,并在完成后致电EndUpdate 以获得最佳性能。使用Items.AddRange 添加项目也有利于性能。

    【讨论】:

      【解决方案3】:

      你能一次分配所有的按钮吗?我的意思是,在读取文件名后创建一个按钮数组(这样您就知道要创建多少个按钮),然后只需在循环中设置它们的属性。我不知道这会加快多少速度,但值得一试。您可能还会看到面板的 Add 方法是否有一个覆盖,该方法接受一个数组或控件列表并一次添加它们。

      【讨论】:

      • 我尝试使用 addRange 方法,但令人惊讶的是它变得更慢:(
      【解决方案4】:

      通常有助于改善缓慢的构造/更改操作的一个技巧是隐藏所涉及的控件和/或父容器。在您的情况下,这意味着在创建控件之前隐藏panel1,然后再显示它。可能对您的情况没有帮助,但值得一试。

      但是,您将遇到基本问题,在 Win32 或 WinForms 中创建如此多的控件。虽然窗口系统现在可以处理这些,但它并不是试图擅长的事情。

      它也不是最好的用户界面。 5 x 400 矩阵中有 2000 个按钮?圣艾芬牛。 不想使用它。如果文件名不适合 150 像素怎么办?您在“150”表示“0.15 mm”的显示器上做什么?

      替代品
      为什么不是列表控件?至少有向上翻页/向下翻页,并提前键入以查找以我输入的文本开头的项目。在它上面添加一个“快速过滤器”编辑控件,在其中输入一些文本会过滤掉任何不包含它的文件,并且您有一个可以有效使用的标准界面。如果您希望有很多项目,您可以将 LitView 控件置于虚拟模式。虽然这会丢失一些内置功能(例如自动调整列大小),但它适用于扔给它的疯狂数量的项目。

      您还可以将按钮呈现为 HTML 链接,并将其显示在浏览器控件中。这不一定更快,但 HTML 会逐步呈现,我可以在您仍在提供项目时使用该列表。

      【讨论】:

      • 我尝试将面板可见状态设置为 false,虽然添加按钮更快,但我节省的几乎所有时间都使面板再次可见。
      • 啊...会很好。所以你可能选择了列表视图?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 2010-09-06
      • 2015-12-31
      • 2019-08-03
      相关资源
      最近更新 更多