利用WinForms应用程序中预先编写的视图代码

时间:2011-04-04 20:43:42

标签: c# winforms code-reuse

我的工作涉及在C#.NET中编写相对较小的WinForms应用程序。有时候,我会获得项目,这些项目是我已经完成的项目的轻微变体。我已经能够通过将域逻辑抽象到自己的程序集中来利用业务逻辑代码进行重用,并在新项目中简单地引用它。

但是,我必须重写很多视图代码(例如Forms)。我曾经尝试过将继承与Form对象一起使用,但即使它起作用也不是设计师的好兆头,并且还需要对项目文件进行一些黑客攻击才能以正确的顺序进行编译。是否有一种简单的方法可以利用我的视图代码在新项目中重复使用?

2 个答案:

答案 0 :(得分:1)

  

是否有一种简单的方法可以利用我的视图代码在新项目中重复使用?

我不知道你的意思简单方法我也不知道你确切的用例场景,但是你可以将视图逻辑封装到reusable WinForms controls中到一个单独的程序集中。这些控件可能包含不同的属性,允许为每个项目个性化它们。

这正是像TelerikDevExpress这样的公司所做的事情,除了你可以更进一步,甚至包含一些可以重复使用的业务逻辑。

答案 1 :(得分: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);
}

我觉得这种基于类的方法很舒服,因为它允许我以一种舒适的方式保持控制行为,具有良好的灵活性。