2010-04-30 44 views
4

我正在维护使用具有大约45个窗体的.NET Framework构建的Windows CE应用程序。有5个“部分”导致你想要的功能。该应用程序是100%全屏幕,重要的是它不能被最小化。精简框架最佳实践:构建GUI

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

我也被告知,最好在应用程序加载时实例化所有表单,而不是为了节省处理时间而对其进行处理。我不确定这一点。

我的问题是,什么是最好的方式去展示,隐藏希望任何1表单在前面的表单,全屏全屏?

回答

3

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

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

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

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

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

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

+1

啊,但是如果你在这些UserControls周围使用框架,你可以创建你自己的Load事件。 – ctacke 2010-04-30 21:54:36

+0

Bah,我甚至不再使用* controls * - 我只是在屏幕上使用BitBlt。 :) – MusiGenesis 2010-04-30 21:56:48

+0

哦,我有一个窗体与47 UserControls的意见。但有趣的是我有一个自定义控件,用于在每个视图上显示*每个* UI元素。基本上,为了获得所需的alphablending,我需要做一个“瑞士军刀”控制,将其与定制绘画混合并放弃工具箱中的所有其他部分。啊CF发展的乐趣。 – ctacke 2010-04-30 22:03:01

3

这个过程中有很多变量,所以没有一种万能的方法。当然,最初加载所有表单意味着页面间导航速度很快,但它会使加载速度变慢,并且它也可能会让内存不足。

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

在任何情况下,你需要做两件事情的总体框架:

  1. 分离模型视图(这些观点是否应为形式,用户CFontrols,面板或任何是完全值得商榷)。
  2. 曲目就是查看在前端和观应该是“下一个”(无论你formaward移动或向后)

我做了这个ages ago for MSDN一个简单的框架文章。我将其更新为使用更纯粹的MVC单独和IoC框架more recently

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

很难给你更细致的建议,因为我们真的不知道你的要求或限制是什么。如果你使用的是缓慢的ARM设备,而且内存和图形负载非常有限,那么我肯定会攻击一些不同的东西(缓存,延迟加载等),而不是Pentium-x86嵌入式设备。

编辑

你会看到,之间MusiGenesis我怎么会攻击这个区别强调了一个事实,没有“正确”的方式。正如我们所说,我正在为全屏嵌入式应用程序编写代码,该应用程序有47个视图,并且该项目只包含一个窗体。他可能会使用47种不同的表格。两者都完成了工作。通用性是我们都有某种形式的底层基础设施,可以处理所有需要知道顶级应用的goo。他依靠ShowDialog弹出窗体的本地z顺序。我依赖一个定制框架来记住你来自哪里。

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

+0

其实,如果我从头开始,* I *会按照你的方式做。我的方法是肯定会破解一些新版本的Windows Mobile(假设会有新版本)的破解。不过,这对新手来说可能更容易一些,因为它更像普通的Windows编程(如果这是件好事)。 – MusiGenesis 2010-04-30 22:15:11