Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使应用程序与windows资源管理器一样快地渲染文件_C#_Windows_Optimization_Explorer - Fatal编程技术网

C# 如何使应用程序与windows资源管理器一样快地渲染文件

C# 如何使应用程序与windows资源管理器一样快地渲染文件,c#,windows,optimization,explorer,C#,Windows,Optimization,Explorer,我有一个文件夹,里面有大量文件。我希望能够将我的每个文件渲染为一个按钮。当我点击按钮时,就会发生一些事情 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 = Dir

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

 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秒

我已经阅读了下面的问题,我明白我正在使用的方法可能不是最好的

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


谢谢

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

控件的创建和管理速度可能非常慢,因为它们通常添加到一个简单的列表或层次结构中(并且单个控件非常复杂)

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


如果你不想自己动手,试试第三方控制。例如,Telerik虚拟化树、列表和网格控件可以显示100万条记录,而不会减慢速度

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

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


确保在添加项目之前以及在完成最佳性能时致电。使用添加项目也有助于提高性能。

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

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

它也不是最好的用户界面。5 x 400矩阵中的2000个按钮?天哪,埃芬牛我不想用这个。如果文件名不适合150像素,您该怎么办?在“150”表示.15毫米的显示器上,您会怎么做

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


您还可以将按钮呈现为HTML链接,并将其显示在浏览器控件中。这不一定更快,但HTML呈现是渐进的,我可以在您仍在输入项目时使用列表

为什么不“像铬一样快”?我怀疑Windows资源管理器是否在使用.NET。它对系统有更深入的了解,并且多年来在多次迭代中进行了优化。@Hamish Grubijan。。。Windows“桌面”资源管理器,而不是Windows“Internet”资源管理器!(顺便说一句,这张照片很吓人)。谢谢,你自己也很难看。他们在哪里测试Chrome“前进”按钮的速度?是的,现在这是我对浏览的最大关注。我尝试将面板可视状态设置为false,虽然添加按钮更快,但我几乎花费了所有节省的时间使面板再次可视。啊。。。那就太好了。所以你可能会选择列表视图?我尝试使用addRange方法,但令人惊讶的是,结果速度变慢了:(