我希望我的C#.NET应用程序有一个表单但不是表单。
当我正常启动Windows窗体应用程序时,就像窗体是其他所有内容的主人:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
相反,我想启动我的程序,然后能够显示表单,但不是表单本身。换句话说,我不希望应用程序的主控制器是形式,我希望它是一个非可视逻辑容器,它具有显示表单的能力,但不是表单本身。
我不确定我是否以明确的方式提出问题,但我想听听。
答案 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;
}
}
}
}