C# - 是否可以用类而不是表单启动我的项目?

时间:2010-05-15 08:29:18

标签: c# .net winforms model-view-controller

我希望我的项目可以通过课程而不是表格来启动,有没有办法做到这一点?或者更确切地说,是否有任何好方法可以确保启动的第一个类(除了Program)不是表单类。

我试图在Program.main()中更改为我的类,但看起来Application.run()需要一个ApplicationContext。 我想我可以改变Program-class来启动另一个类,并让该类使用Application.run()启动表单,但我认为它会导致很多问题,因为我不希望启动相同的表单首先每次和Application.run()必须至少使用一次,最多一次。所以我认为很难跟踪是否已经使用了Application.run()。

另一个可能更为重要的问题;这是在.net中做事的好方法吗?我想这样做的原因是因为我想创建某种MVC项目,其中我想要开始的类是控制器,我将使用的所有表单都是视图。

2 个答案:

答案 0 :(得分:1)

要确定应该首先运行哪个类,您只需在该类中放入应用程序的Main方法。

基本上,创建一个新类,放入Main方法(并从Program.cs中删除它),然后执行所需的逻辑,然后按如下方式启动窗口:

    [STAThread]
    static void FormLauncher()
    {
        Application.EnableVisualStyles();
        Application.Run(new Form1());
    }

Form1是必须启动的表单的名称。

答案 1 :(得分:1)

控制器的示例实现:

public class Controller : ApplicationContext {
    public Controller() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        mInstance = this;
    }
    public Controller Instance { get { return mInstance; } }
    public void Start() {
        Application.Run(this);
    }
    public void Exit() {
        this.ExitThread();
    }
    public void CreateView(Form frm) {
        Views.Add(frm);
        frm.FormClosed += FormClosed;
        frm.Show();
    }
    private void FormClosed(object sender, FormClosedEventArgs e) {
        Views.Remove(sender as Form);
        // NOTE: terminate program when last view closed
        if (Views.Count == 0) Exit();
    }
    private List<Form> Views = new List<Form>();
    private Controller mInstance;

}

您可以像这样使用它:

static class Program {
    [STAThread]
    static void Main() {
        var c = new Controller();
        c.CreateView(new Form1());
        c.Start();
    }
}

同时检查WindowsFormsApplicationBase类是否为控制器的良好基类。对单例应用程序和启动画面的支持很好。