【问题标题】:CompactFramework 2.0 - forms vs. loading conrols into a panelCompactFramework 2.0 - 表单与将控件加载到面板中
【发布时间】:2009-04-21 14:59:53
【问题描述】:

我正在为 Windows Mobile 编写一个基于 WinForms 的应用程序,目标是 CompactFramework 2.0 并使用 C# 进行编码。

我的应用程序有一个菜单,用户可以从中选择重要的工作职能。

我的问题是这样的:

对于特定于作业的屏幕,我应该将 UserControl 加载到主窗体的面板中,还是在主窗体顶部打开一个新窗体更好?

它们似乎都满足了我的需求,我不知道这里是否有一个“正确”的答案。

一种方法比另一种更正确吗?

【问题讨论】:

    标签: c# compact-framework panel


    【解决方案1】:

    表单是控件(只看继承链),表单本身并没有太多的开销。它创建了一个原生窗口,仅此而已。

    推动您做出决定的是您如何在解决方案中使用和显示您的 UI 元素。表单有利于许多 UI 架构,并且它们是大多数开发人员所熟悉的。设计师很好地支持它们,创建、显示、隐藏和关闭表单是一个有据可查的、经常使用的范例,效果很好。是的,每当创建表单时,您都会受到负载惩罚,因为它会创建所有包含的控件,但即使它是 UserControl,您也要付出代价。在任何一种情况下都必须创建子控件。

    有人可能会争辩说,表单要求您每次都重新创建它们,但事实并非如此。如果您使用 ShowDialog 或 Hide 而不是 Close,您可以重复使用您的表单并支付一次费用。这里的优点是表单将您的控件保存在集合中并为您管理所有这些,因此您无需担心 GC 并记住您活着的根。

    UserControl 范例更复杂 - 您必须自己管理加载和卸载控件以保持较低的内存压力。复杂性也增加了成本——维护成本、支持成本和可能的开发成本。然而,在某些情况下,UserControls 也有一些明显的优势。如果您使用 MVC/MVP 模式和某种形式的框架来处理您的视图,则 USerControl 可以通过表单成为工作区来制作非常好的视图(SCSF for the desktop 是一个典型的例子,OpenNETCF.IoC framework 也是如此CF)。

    那么哪个“更好”?这取决于您使用这些元素的方式和位置、您的团队已经如何进行开发以及您如何构建您正在插入的解决方案。简而言之,没有一个正确答案。

    【讨论】:

      【解决方案2】:

      根据我的经验,根据您的硬件,加载控件远远优于启动不同表单。我们的设备(Motorola WT4090 with 32meg)没有硬件加速,绘制完整的表格似乎真的很累。每次启动表单都会有多达 4-6 秒的延迟;然而,控制几乎是即时的。

      【讨论】:

      • 不知道为什么会这样。 Form 派生自 Control,因此它本身就是一个 Control。它只是一个容器控件。它确实有很少的开销,除非它包含的孩子在施工中做了很多工作(这不是表单的错)。
      • @ctacke 我并不是在说我们做错了什么,但我确实尝试过使用表单与控件进行比较,只有几个简单的文本框;类似的结果。特别是在我们的设备上,清除以前的表格,然后显示新的完整表格似乎是一个问题。我猜想速度的提高是因为设备只需要绘制一个小得多的矩形,并且不需要处理之前的任何一个。不过纯属猜测。
      【解决方案3】:

      也许最好的答案是创建一系列用户控件并尝试将它们加载到主窗体上。然后尝试创建一系列只有用户控件的表单来查看是否可以提高性能应该是一件相当容易的事情。

      如果您看不到任何性能优势,这似乎只是一个偏好问题。

      【讨论】:

        【解决方案4】:

        使用表格。这是其他应用程序的行为方式。这是用户expexts您的应用程序工作的方式。

        查看预装的“联系人”应用程序:启动时您会看到一个联系人列表。选择联系人后,将在当前窗口顶部打开一个新表单。它显示了所有联系人的详细信息。从菜单中选择“编辑”将打开另一个表单,允许您编辑联系人。 “任务”应用程序的行为方式相同。

        所以用户知道:单击某处将打开一个新表单,关闭该表单将使我回到上一个表单。你应该与那个知识一起工作而不是反对它。当您使用单个表单时,用户可能会在他实际上想要返回到上一个表单时反复关闭它。

        从性能的角度来看,我发现我的 WM 5 和 WM 6 设备上的表单打开速度足够快(

        虽然可以使用 UserControls 实现类似表单的行为,但在需要类似表单的行为时使用表单似乎更加严格。

        所以我的底线是:使用表单!

        P.S.:有一篇关于 CodeProject 的好文章在:How to create MDI Application in Compact framework

        【讨论】:

        • 所有相同的行为也可以通过 UserControls 来实现。您习惯于在 Forms 中编程,因此它看起来像 Forms 的行为,但这并不意味着它实际上是这样实现的。
        • @ctake:感谢您指出这一点。我相应地编辑了帖子。
        【解决方案5】:

        取决于表单/控件的复杂性。采用 UserControl 路线将提供更好的性能,因为您不会同时处理所有表单创建功能。

        【讨论】:

          【解决方案6】:

          我的建议是为每个不同的逻辑操作创建一个新的 Windows 窗体。如果您需要一个逻辑上独立的表单,那么最好有一个单独的 Windows 表单。

          为了加快速度,您可以在应用程序启动时构建所有表单。这样一来,您的应用程序启动时会出现延迟(大多数用户会对此感到满意),但之后一切都会运行得更快。

          【讨论】:

            猜你喜欢
            • 2013-10-18
            • 1970-01-01
            • 2011-12-21
            • 2012-02-27
            • 1970-01-01
            • 2011-08-01
            • 2012-10-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多