2011-04-04 59 views
2

我的工作涉及在C#.NET中編寫相對較小的WinForms應用程序。有時候我會收到一些項目,這些項目是我已經完成的項目中的輕微變體。通過將領域邏輯抽象爲自己的程序集,我可以利用業務邏輯代碼進行重用,只需在較新的項目中引用它即可。我不得不重寫很多視圖代碼(例如Forms)。我過去曾嘗試過使用Form對象的繼承,但即使它工作了,它也不會對設計師有好處,並且還需要對項目文件進行一些攻擊以便按正確的順序進行編譯。有沒有簡單的方法來利用我的視圖代碼在新項目中重用?利用WinForms應用程序中的預寫視圖代碼

+0

繼承只能讓你到目前爲止。一旦重寫開始變得沉重,並且工具阻礙了,現在是時候砍掉和燃燒。究竟爲什麼你對設計師有問題完全不清楚。 – 2011-04-04 21:00:18

+0

我與設計師的問題是,當我試圖打開它與設計師時,它無法加載父窗體的設計。我想這是有道理的,如果繼承一個表單並不一定意味着繼承設計器代碼。我偏向於使用繼承,因爲它適合我的情況,它根據新的需求取得一個對象(我的Forms)並重寫* some *行爲。 – JeffE 2011-04-04 21:10:52

回答

1

我也遇到了麻煩,無法在我的winforms項目中構建真正可重用的UI代碼塊。

然後,我通過使用UserControls或多或少地達到了這個目標,但是它有時很麻煩,因爲它常常需要很多屬性/方法來進行子類化,因爲它旨在在不同的項目中重複使用,佈局。

這就是爲什麼我使用Helper類來設置一些控件屬性,以這種方式傳遞控件參數。例如:

void SetupEditableGrid(UltraGrid myGrid) 
{ 
    myGrid.BackColor... 
} 

與一些特定的控制相關此外,對於最複雜的對象需要更多的工作,我使用的控制器類。例如,我使用MyEditableUltraGridController來準備原始Infragistic的UltraGrid以完全編輯。

public class MyEditableUltraGridController() 
{ 
    UltraGrid _myGrid; 

    public MyEditableUltraGridController(UltraGrid myGrid) 
    { 
     _myGrid = myGrid; 
     _myGrid.InitializeLayout += ... // some common initialization code 
     _myGrid.KeyPressed += ... // some keystroke handling code 
     ... etc ... 
    } 

    void InitializeLayout(object sender, EventArgs e) 
    { 
     ... some specific UltraGrid common initialization code 
    } 

    ... // some code that make my UltraGrid editable, etc... 
} 

然後,考慮到我的窗體上的現有UltraGrid1控制,我將有:

Form_Load(object sender, EventArgs e) 
{ 
    var MyEditableUltraGridController = 
     new MyEditableUltraGridController(UltraGrid1); 
} 

我感到舒適與此基於等級的方法,因爲它可以讓我保持控制行爲舒適的方式與良好的靈活性。

+0

這很有幫助,並且是一個很好的例子。謝謝 – JeffE 2011-04-14 16:03:27

1

有沒有一種簡單的方法來利用我的視圖代碼在新項目中重用?

我不知道你的簡單的方法是什麼意思,也不知道您的具體使用情況,但你可以封裝視圖邏輯爲reusable WinForms controls到一個單獨的組件。這些控件可能包含不同的屬性,允許爲每個項目進行個性化設置。

這正是TelerikDevExpress這樣的公司所做的,只是您可以進一步,甚至包含可以重複使用的一些業務邏輯。