【问题标题】:How manage a large interface for a WinForms application?如何管理 WinForms 应用程序的大界面?
【发布时间】:2010-11-15 17:57:26
【问题描述】:

当想到SRP 时,我发现我正在编写的应用程序对于我们的主界面/表单来说已经失控了。我想在我们深入项目之前对其进行更改。

有哪些技术可以制作一个带有工具栏、菜单等“绘图表面”的大型界面?我还希望这种形式易于测试。是否应该有其他类知道如何控制MainForm,例如ChangedStateTracker(监控脏状态)、DocumentCreator 或类似“文件>新建”新文​​档的类?

我遇到的问题是MainForm.cs 中有这么多方法,而且它真的开始变得难以维护。

如有必要,可以将其标记为 CW。任何其他提示/提示将不胜感激。

【问题讨论】:

  • 拆分你的代码。无论如何,表单都是作为部分类创建的,因此将方法组织到更多代码文件中,当然还要考虑可以将哪些逻辑代码单元移动到单独的类中。此外,如果您使用的是 VS2010,请考虑使用 VS10x Code Map 等扩展,这对于处理大型代码文件有很大帮助。

标签: c# .net winforms user-interface


【解决方案1】:

如果这是一个选项,我会创建一组用户控件,共同生成整个表单。

这些单独的用户控件可以有自己的责任,可以单独进行测试。

对于逻辑本身,创建类。

您可以创建像CreateDocumentCommand 这样实现某些功能的类。当例如单击新文档按钮/菜单项,创建此类的实例并执行它。

public interface ICommand
{
    bool CanExecute { get; }
    void Execute();
}

public class SaveDocumentCommand : ICommand
{
    public bool CanExecute
    {
        get
        {
            return MainForm.Instance.CurrentDocument.IsDirty;
        }
    }

    public void Execute()
    {
        // Save your document here.
    }
}

顺便说一句,WPF 就是这样做的。

【讨论】:

  • @Pieter - 是的,“主绘图表面”已经是它自己的控件(它已经太大了,但那是另一回事)。 真的只有主绘图表面和菜单/工具栏。我显然可以将事件处理程序钩子放在MainForm.cs 中,但是在其中放置“新文档”逻辑(等)只是感觉错误......
  • 另外 - 我认为我的标题中的“大界面”有点误导(因为它没有太多内容),对此感到抱歉。
  • 扩大了答案。也许这有帮助。
  • @Pieter - 感谢您的编辑,我目前一直在大量使用命令模式。
  • @TheCloudlessSky - 那么您能否更具体地说明您的问题是什么。听起来您的设置大致可以:)。
【解决方案2】:

Jeremy Miller 已经写过几次了 - 这些应该可以帮助您入门:

【讨论】:

    最近更新 更多