一尘不染

Windows窗体初始屏幕-加载主窗体时显示窗体

c#

我试图使启动画面先出现,然后启动画面MainForm出现。但是我在初始屏幕中显示的进度条没有到达进度条的末尾。并且该程序继续运行,无法正常工作。

加载主表单期间如何显示初始屏幕?

我的代码是这样的:

public partial class SplashForm : Form
{
    public SplashForm()
    { 
        InitializeComponent();
    }
    private void SplashForm_Load(object sender, EventArgs e)
    {
        timer1.Enabled = true;
        timer1.Start();
        timer1.Interval = 1000;
        progressBar1.Maximum = 10;
        timer1.Tick += new EventHandler(timer1_Tick);
    }
    public void timer1_Tick(object sender, EventArgs e)
    {
        if (progressBar1.Value != 10)
        {
            progressBar1.Value++;
        }
        else
        {
            timer1.Stop();
            Application.Exit();
        }
    }     
}

这是的代码的第一部分MainForm

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
        Application.Run(new SplashForm());
    }
}

阅读 356

收藏
2020-05-19

共1个答案

一尘不染

有多种创建初始屏幕的方法:

  • 您可以依靠的启动画面功能 WindowsFormsApplicationBase

  • 您可以通过在其他UI线程上显示表单并将表单成功加载到主窗口后隐藏起来,来亲自展示实现该功能。

在这篇文章中,我将展示两种解决方案的示例。

注意:那些正在寻找在数据加载期间显示加载窗口或gif动画的人,可以看看这篇文章:在其他线程中加载数据期间显示加载动画

选项1-使用WindowsFormsApplicationBase启动画面功能

  1. 添加Microsoft.VisualBasic.dll对您的项目的引用。
  2. MyApplication通过派生来创建一个类WindowsFormsApplicationBase
  3. 覆盖OnCreateMainForm并将您要用作启动表单的表单分配给MainForm属性。
  4. 覆盖OnCreateSplashScreen并将要显示为初始屏幕的表单分配给SplashScreen属性。

  5. 在您的Main方法中,创建的实例MyApplication并调用其Run方法。

using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(true);
        var app = new MyApplication();
        app.Run(Environment.GetCommandLineArgs());
    }
}
public class MyApplication : WindowsFormsApplicationBase
{
    protected override void OnCreateMainForm()
    {
        MainForm = new YourMainForm();
    }
    protected override void OnCreateSplashScreen()
    {
        SplashScreen = new YourSplashForm();
    }
}

选项2-使用其他UI线程实施功能

您可以通过在其他UI线程中显示初始屏幕来自己实现此功能。为此,您可以LoadProgram课堂上订阅主窗体的事件,并在那里显示和关闭初始屏幕。

using System;
using System.Threading;
using System.Windows.Forms;

static class Program
{
    static Form SplashScreen;
    static Form MainForm;
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        //Show Splash Form
        SplashScreen = new Form();
        var splashThread = new Thread(new ThreadStart(
            () => Application.Run(SplashScreen)));
        splashThread.SetApartmentState(ApartmentState.STA);
        splashThread.Start();

        //Create and Show Main Form
        MainForm = new Form8();
        MainForm.Load += MainForm_LoadCompleted;
        Application.Run(MainForm);
    }
    private static void MainForm_LoadCompleted(object sender, EventArgs e)
    {
        if (SplashScreen != null && !SplashScreen.Disposing && !SplashScreen.IsDisposed)
            SplashScreen.Invoke(new Action(() => SplashScreen.Close()));
        MainForm.TopMost = true;
        MainForm.Activate();
        MainForm.TopMost = false;
    }
}

注意:要显示平滑的边缘自定义形状的初始屏幕,请查看以下文章:Windows Forms Transparent Background
Image

2020-05-19