代码之家  ›  专栏  ›  技术社区  ›  Michael Klement

C:如何巧妙地为考虑封装的桌面应用程序设计GUI

  •  0
  • Michael Klement  · 技术社区  · 15 年前

    我正在开发一个大型桌面应用程序。在不同级别的几个容器中有很多控件(splitcontainers、tabpages、panels)。

    现在,我想通过分离负责数据绑定和清除控件的所有控制器代码,或者将用户交互划分为单独的控制器类来重构这个类。

    [编辑]

    目的

    此应用程序的目的是跟踪订单(称为作业)及其位置(称为作业项)。每个工作都与客户相关,每个工作项与一篇文章相关(工作项包含特定于其文章的制造过程的信息,因此它包装了文章)。作业、作业项、客户和项目具有由PropertyManager类管理的动态属性(基本键/值对)。

    建筑

    我的应用程序分为两个主要项目:核心包含3个LinqToSQL DataContext类中的数据模型:

    • ArticleManagement
    • JobManagement
    • PropertyManagement

    对于每个DataContext类,都有一个 XyzManager 类,该类将集合中的LinqToSQL对象提供给GUI,封装LinqToSQL数据源。它还处理对其相应的DataContext类型的创建、删除和修改。

    然后我得到了一个GUI项目,它自然包含一个主窗体和一些用于选项等内容的附加窗体。到目前为止,我的GUI项目持有对每个XYZManager类的引用,并根据用户交互指令通过管理器类获取和设置数据,其中包含所有控制逻辑。

    我已经将这方面的大部分独立逻辑放到了主窗体类之外的静态实用程序类中,但我想这是一种不太理想的方法。

    [/编辑]

    这是我的第一个更大的桌面应用程序,我很难封装图形用户界面。目前为止,所有负责处理用户交互的控制器代码都位于mainform类中。

    我知道MVC模式,但我不知道如何将它应用于我当前设计的C WinForm。

    仅我的自定义代码就有2400多行代码长,不算在自动生成的表单代码中,呈上升趋势。我想重构这个,但是我对如何以更优雅的方式解决这个问题感到迷茫。

    4 回复  |  直到 15 年前
        1
  •  3
  •   khebbie    15 年前

    对于小规模应用程序,您应该看看模型视图演示者(MVP),这里有一个很好的演示(在我看来)实现MVP的最佳方法: http://martinfowler.com/eaaDev/SupervisingPresenter.html

        2
  •  2
  •   tanascius    15 年前

    通常,我尝试使用较小的用户控件组成一个复杂的GUI。但有几点非常重要:

    • 每个用户控件都应该是独立的(尤其是表单)
    • 用于显示或更改某些数据的用户控件应仅依赖于此数据。您应该尝试以一种方式实现控件,使它们可以绑定到为控件所需的所有数据提供服务的数据源。
    • 当需要将信息移交给父容器(另一个用户控件或表单)时,请使用容器可以订阅的事件。
    • 使用(上下文-)菜单时,请检查它们是否绑定到某些项。您应该在项目附近创建菜单,而不是在用户控件内。因此,当您在不同的视图(控件)中多次在GUI上显示相同的项时,每个项都应该具有相同的ContextMenu。
    • 尝试对按钮/菜单的操作应用命令模式。

    你的解决方案听起来好像你到现在还不能把不同的责任分开。仅仅将代码划分为不同的控件,没有明确的边界和责任是不够的。

        3
  •  0
  •   RichardOD    15 年前
        4
  •  0
  •   arbiter    15 年前

    你只对一张表格使用JobController吗?如果是,那么也许您所需要的就是将代码拆分为多个文件,使用 partial keyword ?