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

时间:2010-07-07 18:55:17

标签: c# windows winforms .net-3.5

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

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

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

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

我不确定我是否以明确的方式提出问题,但我想听听。

6 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分: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;
}

请注意,关闭最后一个窗口时,应用程序不会自动关闭。

需要明确调用ExitThread

答案 2 :(得分:2)

正如Mark_Gravell所提到的,Application.Run()会阻塞,直到Form1关闭。您可以在单独的线程上打开表单,但该表单基本上会使用该线程。当你想要exe退出时,你将不得不手动杀死每个线程。请参阅以下代码。 (它不会创建一个控制台窗口。我通过创建默认的WinForms应用程序并更改Program类来实现此目的)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication1
{
    static class Program
    {

        static List<Thread> threads = new List<Thread>();
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            for (int i = 0; i < 10; i++)
            {
                StartThread();
                System.Threading.Thread.Sleep(500);
            }
            //kill each thread so the app will exit, otherwise, the app won't close
            //until all forms are manually closed...
            threads.ForEach(t => t.Abort());
        }

        static void StartThread()
        {
            Thread t = new Thread(ShowForm);
            threads.Add(t);
            t.Start();
        }

        static void ShowForm()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

答案 3 :(得分: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());
        }
    }
}

答案 4 :(得分:1)

将应用程序创建为控制台应用程序,然后在需要表单时,如Marc所说,调用Application.Run。

答案 5 :(得分:0)

您还可以创建自己的ApplicationContext

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(AppController.Instance);
}

在AppController.cs中

namespace MyApplication
{
    public class AppController
    {
         static AppController _AppController;

         public LoginWIndow LoginWIndow;

         //Constructor
         public void AppController()
         {
             //Do what you will here, Start login form, bind events, w.e :)

             if(true) //Your check
             {
                 ShowLoginWindow();
             }
         }

         public void ShowLoginWindow()
         {
             LoginWIndow = new LoginWIndow();
             LoginWIndow.ClosedForm += new FormClosedEventHander(ExitApplication);
             LoginWIndow.Show();
         }

         public void ExitApplication(Object Sender, FormClosedEventArgs Args) 
         {
            //Some shutdown login Logic, then
            Application.Exit();
         }

         static AppController Instance
         {
            get
            {
                 if(_AppController == null)
                 {
                     _AppController = new AppController();
                 }
                 return _AppController;
            }
         }
    }
}