为什么我的SplashScreen没有显示标签(文字)

时间:2015-05-04 19:00:23

标签: c# winforms splash-screen

我有一个名为WinForm的{​​{1}}带有简单标签,SpalshScreen.cs属性设置为"数据加载..."。标签以表格为中心。我还有一个名为Text方法的公共方法。

我的DoClose()方法包含:

MainForm.Form_Load

然而,当我跑步时,我的Splash确实出现了,但是,标签文本假定它只显示一个浅色盒子。

如果我将Hide(); SplashScreen form = new SplashScreen(); form.Show(); // Simulate Doing Database Table Load(s) Thread.Sleep(5000); form.DoClose(); Show(); 更改为form.Show();,文本会正确显示,但主循环会暂停,直到我关闭启动窗口。

2 个答案:

答案 0 :(得分:1)

经过一系列试验和错误......诀窍是不阻止UI线程,因为@Servy说。

Form_Load方法需要更改为:

Hide();
Splash.Show();

// Everything after this line must be Non UI Thread Blocking
Task task = new Task(LoadDataAsync);
task.Start();
task.Wait();

Splash.DoClose();
Show();

我创建了一个LoadDataAsync方法来处理其他所有事情:

    private async void LoadDataAsync()
    {
        await Context.Employees.LoadAsync();
        await Context.Customers.LoadAsync();

        // The Invoke/Action Wrapper Keeps Modification of UI Elements from
        // complaining about what thread they are on.
        if (EmployeeDataGridView.InvokeRequired)
        {
            Action act = () => EmployeeBindingSource.DataSource = Context.Employees.Local.ToBindingList();
            EmployeeDataGridView.Invoke(act);
        }

        if (CustomerComboBox.InvokeRequired)
        {
            Action act = () =>
            {
                CustomerBindingSource.DataSource = GetCustomerList();
                CustomerComboBox.SelectedIndex = -1;
            };
            CustomerComboBox.Invoke(act);
        }
    }

我还将我使用的任何私有字段和私有方法设置为静态。

答案 1 :(得分:0)

在启动画面窗体内使用计时器而不是thread.sleep(例如5秒后关闭启动画面),并设置关闭事件。

var form = new SplashScreen();
form.Closed += (s,e)=>{
    Show();
}
form.Show();