Compact Framework最佳实践:构建GUI

时间:2010-04-30 20:41:55

标签: .net user-interface compact-framework

我正在维护一个使用.NET Framework构建的Windows CE应用程序,该应用程序包含大约45个表单。有5个“部分”可以实现您想要的功能。该应用程序100%全屏,重要的是它不能最小化。

由于表格很多,很难跟踪一个表格在关闭之后应该显示哪个表格。为此,我在显示表单所有者属性之前设置它,并在关闭它时显示所有者。

我也被告知,最好在应用程序加载时实例化所有表单,而不是将它们丢弃以节省处理时间。我不确定这一点。

我的问题是,最好的展示方式是什么,隐藏表格,你希望任何一个表格都在前面,全屏显示?

2 个答案:

答案 0 :(得分:3)

流程中存在大量变量,因此没有一种通用的方法。当然,最初加载所有表单意味着页面间导航速度很快,但它会使加载速度变慢,并且还可能使您无法运行。

我的一般方法是使用一个框架 - 我个人是OpenNETCF IoC framework的粉丝,但后来我可能有偏见。

无论如何,您需要一个可以完成两件事的通用框架:

  1. 将视图与模型分开(无论这些视图应该是FOrms,用户CFontrols,Panels还是其他什么都是完全有争议的。)
  2. 跟踪视图在哪个方面以及哪个视图应该是“下一个”(无论您是向前还是向后移动)
  3. 我在这个ages ago for MSDN上做了一个简单的框架文章。我更新了它以使用更纯粹的MVC单独和IoC框架more recently

    这并不是说我的方式是唯一的方式,甚至是“正确”的方式。然而,我发现这种方法在桌面和设备上的多个部署中都取得了成功。

    由于我们真的不知道您的要求或限制是什么,因此很难给出更细粒度的建议。如果你在内存和图形负载非常有限的慢速ARM设备上运行,我肯定会攻击一些不同的东西(缓存,延迟加载等),而不是具有大量内存的奔腾级x86嵌入式设备。

    修改

    你会发现MusiGenesis和我之间的攻击方式之间的区别突出了没有“正确”方式的事实。正如我们所说,我正在为具有47个视图的全屏嵌入式应用程序执行代码,并且该项目包含一个且仅包含一个Form。他可能会使用47种不同的表格。两人都完成了工作。通用性是我们都有某种形式的底层基础设施,可以处理所有需要知道应该是什么的goo。他依赖ShowDialog弹出Forms的原生z顺序。我依靠一个自定义框架来记住你来自哪里。

    同样,这只是强调没有对错 - 只要它符合项目要求。

答案 1 :(得分:3)

当应用程序启动时,我不会去实例化45个表单的路径。这会严重延长启动时间,并可能(如果不是可能)耗尽内存资源,所有这些都是为了提供用户可能甚至不需要的功能。

在我的WinMo应用程序中,每个表单都设计为使用相对较小的数据子集,因此启动时间仅限于数据库调用并将数据加载到表单的控件中。通常,实例化其中一个表单并显示它所需的时间不会超过一秒或两秒。

如果您的表单花费的时间超过此时间,则可能是您的数据检索存在问题,或者数据加载到表单控件中的方式(例如,您可能有一个自定义gridview控件,可以完全呈现​​所有300行,即使一次只能看到12个)。如果您的数据太大以至于合法地需要很长时间才能检索,那么可能的数据远远超过用户实际上可以与之交互的数据。

我假设您提到“5个部分”以获得用户需要去的地方意味着他们可能(最多)将“向下钻取”5个级别。如果你通过让每个表单实例化并使用ShowDialog显示下一个表单来实现这一点,那么任何时候你都会有至多5-6个表单,这对于.Net CF应用程序来说不应该是任何问题(我一直这样做)。通过这种方式,您无需执行任何特殊操作即可跟踪何时应显示哪种表单 - 您只需从任何地方打开表单,当表单关闭时,您将自动返回到调用表单。

你必须处理一些z-order /任务管理器的怪异,但它并不是特别复杂。在子表单上调用ShowDialog之前,将父表单的Text属性设置为空字符串,然后在ShowDialog返回后将其设置回表单的原始标题。这不是必需的,但在Windows Mobile(至少版本6)中,所有打开的.Net表单(具有非空文本属性)都显示在正在运行的程序列表中,即使它们都来自同一个应用。我通常喜欢我的多表单应用程序看起来只是一个程序,所以我通常将每个表单的Text设置为应用程序的名称。

我还尝试了一个单一形式的应用程序,它将每个UI实现为UserControl而不是Form,然后创建和堆叠控件,就像创建和打开表单一样。这有效,但它是一个黑客,我不推荐它。表单有一个Load事件而UserControls没有,这是主要问题。