2011-04-04 60 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这样的公司所做的,只是您可以进一步,甚至包含可以重复使用的一些业务逻辑。