如何使应用程序有一个表单但不是一个表单?

Ada*_*ane 5 c# windows .net-3.5 winforms

我希望我的C#.NET应用程序有一个表单,但不是一个表单.

当我正常启动一个Windows窗体应用程序时,就像该窗体是其他所有内容的主人:

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
Run Code Online (Sandbox Code Playgroud)

相反,我想启动我的程序,然后能够显示一个表单,但不是表单本身.换句话说,我不希望应用程序的主控制器是形式,我希望它是一个非可视逻辑容器,它具有显示表单的能力,但不是表单本身.

我不确定我是否以明确的方式提出问题,但我想听听他们的想法.

Mar*_*ell 7

您可以使用它Application.Run()来运行消息循环.但你需要做一些事情来听取输入 - 也许是一个系统等等.


Han*_*ant 5

您可以使用ApplicationContext.这将为您提供必要的消息循环,一旦您决定创建一个表单,它将使表单保持活动状态.使您的Program类看起来类似于:

static class Program {
    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        AppContext = new ApplicationContext();
        Application.Run(AppContext);
    }
    public static void Quit() {
        AppContext.ExitThread();
    }
    public static ApplicationContext AppContext;
}
Run Code Online (Sandbox Code Playgroud)

请注意,关闭最后一个窗口时,应用程序不会自动关闭.需要显式调用ExitThread.


Der*_*eer 2

创建一个单独的 Bootstrapper 组件是相当常见的,您可以将主窗体的显示移动到:

using System;
using System.Windows.Forms;

namespace Example
{
    internal static class Program
    {
        [STAThread]
        private static void Main()
        {
            new Bootstrapper().Run();
        }
    }

    public class Bootstrapper
    {
        public void Run()
        {
            // [Application initialization here]
            ShowView();
        }

        private static void ShowView()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)