我有一个 SplashScreen,它应该显示在应用程序中所有其他窗口的前面。
因为它是一个SplashScreen
,所以这不能是模态对话框。相反,这应该通过其他线程显示。
我是这样创建启动画面的:
SplashScreenForm = new SplashScreen(mainForm);
// SplashScreenForm.TopMost = true;
为了展示它,我正在使用这个调用,从另一个线程调用:
Application.Run(SplashScreenForm);
如果我取消注释 SplashScreenForm.TopMost = true
,启动画面将显示在其他窗口的顶部,甚至是属于不同应用程序的窗口的顶部。
如果想知道线程是如何创建的:
public void ShowSplashScreen()
{
SplashScreenThread = new Thread(new ThreadStart(ShowForm));
SplashScreenThread.IsBackground = true;
SplashScreenThread.Name = "SplashScreenThread";
SplashScreenThread.Start();
}
private static void ShowForm()
{
Application.Run(SplashScreenForm);
}
我该怎么做?
最佳答案
类似于:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Thread splashThread = new Thread(new ThreadStart(
delegate
{
splashForm = new SplashForm();
Application.Run(splashForm);
}
));
splashThread.SetApartmentState(ApartmentState.STA);
splashThread.Start();
// Load main form and do lengthy operations
MainForm mainForm = new MainForm();
mainForm.Load += new EventHandler(mainForm_Load);
Application.Run(mainForm);
}
然后在耗时操作结束后:
static void mainForm_Load(object sender, EventArgs e)
{
if (splashForm == null)
return;
splashForm.Invoke(new Action(splashForm.Close));
splashForm.Dispose();
splashForm = null;
}
这将在您的主窗体之前启动启动画面,并且仅在 mainForm_Load
中的冗长操作完成后才关闭它。
关于c# - 如何在同一应用程序的所有窗口之上显示一个窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44590678/