2009-06-24 64 views
0

我正在開發一個桌面應用程序,它的主窗體生長得相當大。在不同級別的多個容器中有很多控件(SplitContainers,TabPages,Panels)。C#:如何巧妙地設計一個桌面應用程序的圖形用戶界面,封裝在心裏

現在我想通過分離負責數據綁定的所有控制器代碼來重構此類,將控件清理或執行用戶交互到單獨的控制器類中。

[編輯]

目的

這個應用程序的目的是爲了跟蹤訂單(稱爲作業)以及它們的位置(稱爲Jobitem)。每個工作都與一個客戶相關,每個工作項目與一篇文章相關(工作項目包含特定於其文章製造過程的信息,因此它將包裝文章)。 Job,Jobitem,Customer和Article具有由PropertyManager類管理的動態屬性(基本鍵/值對)。

架構

我的應用程序被分成2個主要項目:核心包含3種LinqToSQL的DataContext類的數據模型:

  • ArticleManagement
  • JobManagement
  • PropertyManagement

對於每個DataContext類,都有一個XyzManager類,它將集合中的LinqToSQL對象提供給GUI,封裝LinqToSQL數據源。它還處理創建,刪除和修改其相應的DataContext類型。

然後我有一個GUI項目,當然包含一個主窗體和一些額外的窗體,像選項等東西。截至目前,我的GUI項目持有對每個XyzManager類的引用,並通過設置數據通過Manager類作爲用戶交互指令,包含所有控制邏輯。

我已經把大部分獨立邏輯放到了主窗體類之外的靜態工具類中,但這是我猜想的不太理想的方法。

[/編輯]

這是我的第一大桌面應用程序,我有一個很難封裝GUI。截至目前,負責處理用戶交互的所有控制器代碼都駐留在MainForm類中。

我知道MVC模式,但我不知道如何將它應用於C#WinForm,並使用我當前的設計。

我的自定義代碼單獨超過2400行代碼長,不計算在窗體的自動生成的代碼中,具有上升趨勢。我想重構這個,但是我失去了如何以更優雅的方式解決這個問題。

回答

3

對於小規模的應用程序,你應該看看模型 - 視圖 - 演示者(MVP),存在的一個很好的演示(在我看來)做MVP最好的方法: http://martinfowler.com/eaaDev/SupervisingPresenter.html

+0

感謝您的鏈接。 Martin Fowler最後表示,當你想要測試你的GUI時,監督演示者是很好的,但是從控制器和視圖中分離出來並不是那麼好,所以這不是我要找的東西,因爲分離是我的主要目標。可測試性不是問題。演示模型聽起來更適合這個目標。 – 2009-06-24 08:29:39

+0

由於鏈接指向正確的方向,因此被接受爲答案。儘管我現在使用被動視圖(http://martinfowler.com/eaaDev/PassiveScreen.html)作爲解決方案。 – 2009-06-26 05:57:13

2

通常我會嘗試使用較小的UserControl來組成複雜的GUI。但有幾點是非常重要的:

  • 每個用戶控件的應該是獨立的(特別是從表)
  • 用戶控件是有purpuse顯示或改變某些數據應該僅僅依靠這些數據。您應該嘗試以可以綁定到提供控件所需數據的DataSource的方式實現您的控件。
  • 當您需要將信息交給父容器(另一個UserControl或Form)時,使用容器可以訂閱的事件。
  • 當您使用(上下文)菜單時,檢查它們是否綁定到某些項目。您應該在項目附近創建菜單,而不是在UserControl中創建菜單。因此,當您在GUI上以不同的視圖(控件)多次顯示相同的項目時,每個項目應具有相同的上下文菜單。
  • 嘗試應用按鈕/菜單操作的命令模式。

你的解決方案聽起來像你不能分開不同的責任,直到現在。只是將代碼分成不同的控制而沒有明確的邊界和責任是不夠的。

+0

那麼你有什麼建議來區分不同的responsilibites?我已經在主要帖子中編輯了一些關於我的架構的更多解釋。 – 2009-06-24 11:21:48

0

你用JobController只適用於一種形式?如果是的話,那麼也許你需要的只是將代碼分成幾個文件使用partial keyword

相關問題