天天看點

WinForm企業應用架構設計【三】架構窗體設計;動态建立菜單;

我也不會發現第一篇中關于“充血實體”的錯誤說法(至少~我寫文章的時候~内心的想法是錯的~)

我個人不是很喜歡領域驅動設計~感覺這種思路(我們暫且叫它思路~雖然它有一些既有的原則和模式)

重點要求架構師深入到業務領域中去~

但是在國内往往很難真正的與領域專家做深入交流~

架構師劃分的領域模型和聚合往往與真實的情況差别較大~

即使劃分的較好~新的業務和變化的業務也另設計師非常頭疼~

另外

設計師很難将龐大複雜的業務抽象成領域模型

往往需要引入更為複雜的模型以對真實業務進行模組化

-----------

我看你們都是娈童癖~這玩意還沒發育成熟~就拿過去搞~有啥意思~

我下一章打算寫“登入;閃屏;用戶端資料緩存;WCF安全驗證”

(這些東西的代碼還沒個影子)

----------------------

問題一:關于調試

如果你的跟着我的章節在做練習~

那麼你可能會遇到從用戶端單步調試進入到WCF端的過程

我的WCF是直接用的IIS7.5的虛拟目錄

單步跳入WCF之前會提示

WinForm企業應用架構設計【三】架構窗體設計;動态建立菜單;

直接點[附加]就可以調試了~

問題二:關于建立動态WCF服務不完善的地方

在本系列第一篇中,我們使用了衆多servicefactory來建立服務;這樣是不好的

我對那段代碼做了修改

好吧!言歸正傳

一:架構窗體

先看圖檔 

WinForm企業應用架構設計【三】架構窗體設計;動态建立菜單;

架構窗體分管布局的隻有四個Panel;

上、下、左、右。(搞過EXTJS的人比較喜歡說成東、南、西、北)-_-!

最上面的Panel是存放頂級菜單用的 (top menu)

最下面的panel是存放狀态資訊和系統版本用的

左邊的Panel又分為兩個panel

上面的是sub menu header 

下面的是sub menu

當點選一個top menu之後,sub menu中将出現所有此top menu下的子菜單

sub menu header就是這個top menu的名字

(因為我們的top menu沒有選中狀态;是以這裡做一個sub menu header;讓使用者知道他點的是哪個頂菜單;sub menu就有選中狀态了)

右側的Panel也分為兩個Panel

  上面的是tabs

  下面的是child form

   tabs是為了存放使用者打開過的業務窗體的标題;當使用者點選某個tab,将激活該窗體(在child form中顯示)

  child form是目前正在操作的業務窗體

  (這裡有例子會容易了解一些)

左右panel中間夾着一個splitter

此splitter可以拖動改變左右panel的寬度

這裡需要注意一點

應該先把左側panel拖進窗體,設定Dock left,

再拖一個splitter進窗體,他是天然的Dock left,

再拖右側panel進窗體,設定Dock fill

這樣splitter才會起作用

至于怎麼把其他panel拖動到這個窗體中來~我就不多說了

二:動态建立頂部菜單

現在我們就準備在界面上顯示菜單 

IsInDesignMode是為了判斷目前的窗體是不是出于設計狀态

(設計狀态會執行一些代碼~如果不進行處理~窗體就無法設計)

代碼如下~

由于建立菜單~和響應菜單的點選事件需要很多代碼

我們把這些與菜單相關的代碼統一放在一個partial類裡

WinForm企業應用架構設計【三】架構窗體設計;動态建立菜單;

如你所見~我已經對上一章中寫的PrepareMenus做了一些修改~這些修改是為下一章服務~現在先不講

先看CreateTopMenu

對啦!頂部菜單就是一個label!

這些label建立出來之後,全部把他們放到TopMenuP這個panel了

這個panel就是頂部panel

tm.Left = index * 68 + index * 12 + 12;

這一句的作用是把這些頂級菜單依次排開~避免覆寫~

另外我把MenuModel的執行個體指派給這個label的Tag屬性了~後面有用

我為這些label注冊了同樣的滑鼠劃入、劃出、彈起 事件

現在就看看這些事件

頂部菜單劃出和劃入都沒有什麼特别的

隻不過是改變了這個label的背景顔色和文字顔色

注意:這些顔色的值~應該放到資源或者緩存裡去~

滑鼠彈起事件~就說明客戶點選了這個lable

我們把tag屬性轉換成MenuModel

然後就開始建立子菜單了

三:動态建立子菜單

代碼如下

建立子菜單和建立頂部菜單~在原理上是一樣的

也是用的label

sm.Anchor = (System.Windows.Forms.AnchorStyles)(AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right);

有了這一句子菜單的寬度會根着Left Panel的寬度的變化而變化

同時也注冊了滑鼠的滑入、滑出、彈起事件

彈起事件就是我們動态建立業務窗體的事件

我們放到後一節内容介紹

滑入和滑出的代碼如下:

再次強烈要求

喜歡這篇文章或者喜歡我這個人的朋友~點推薦~點推薦~點推薦~點推薦~

繼續閱讀