Как подать заявку ИМЕТЬ форму, но не БЫТЬ форму? - PullRequest
5 голосов
/ 07 июля 2010

Я хочу, чтобы мое приложение на C # .NET имело форму, но не было формой.

Когда я обычно запускаю приложение Windows Form, это похоже на то, что форма - мастер всего остального, что следует:

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

Вместо этого я хотел бы запустить мою программу, которая затем может показывать форму, но не является самой формой. Другими словами, я не хочу, чтобы главный контроллер приложения был формой, я бы хотел, чтобы он был невизуальным логическим контейнером, который может отображать формы, но не сам по себе.

Я не уверен, ясно ли я задаю вопрос, но хотелось бы услышать мысли.

Ответы [ 6 ]

7 голосов
/ 07 июля 2010

Вы можете просто использовать Application.Run(), чтобы запустить цикл обработки сообщений.Но вам нужно сделать что-то , чтобы прослушать ввод - возможно, системный спрей и т. Д.

5 голосов
/ 07 июля 2010

Вместо этого вы можете использовать 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 голосов
/ 12 июля 2010

Довольно часто создается отдельный компонент 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());
        }
    }
}
2 голосов
/ 07 июля 2010

Как отмечал 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());
        }
    }
}
1 голос
/ 07 июля 2010

Создайте приложение как консольное приложение и затем вызовите Application.Run, как сказал Марк, когда вам нужна форма.

0 голосов
/ 16 июля 2010

Вы также можете создать свой собственный 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;
            }
         }
    }
}
...