2010-04-30 27 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