【问题标题】:Leveraging pre-written view code in WinForms applications在 WinForms 应用程序中利用预先编写的视图代码
【发布时间】:2011-07-29 11:36:34
【问题描述】:

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

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

【问题讨论】:

  • 继承只能帮到你。一旦重写开始变得繁重并且工具妨碍了,就该大刀阔斧了。究竟为什么你对设计师有问题完全不清楚。
  • 我的设计器的问题是当我试图用设计器打开它时它无法加载父窗体的设计。我想这是有道理的,如果继承表单并不一定意味着继承设计器代码。我偏爱使用继承,因为它非常适合我的情况,即获取一个对象(我的表单)并根据新要求覆盖 some 行为。

标签: c# winforms code-reuse


【解决方案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);
}

我对这种基于类的方法感到满意,因为它使我能够以一种舒适的方式保持控制行为并具有良好的灵活性。

【讨论】:

    【解决方案2】:

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

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

    这正是像 TelerikDevExpress 这样的公司所做的,只是您可以更进一步,甚至可以合并一些可以重用的业务逻辑。

    【讨论】:

      猜你喜欢
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      • 2010-12-11
      • 2010-11-30
      • 1970-01-01
      • 2011-09-22
      相关资源
      最近更新 更多