好的,根据以下答案的建议,我删除了我的线程方法,现在我的程序看起来像这样: Program.cs的
static void Main(){
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
FrmWWCShell FrmWWCShell = null;
var splash = new FrmSplash();
splash.SplashFormInitialized += delegate
{
FrmWWCShell = new FrmWWCShell();
splash.Close();
};
Application.Run(splash);
Application.Run(FrmWWCShell);
}
和 FrmSplash.cs 这样:
public partial class FrmSplash : Form
{
public FrmSplash()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
splashTimer.Interval = 1;
splashTimer.Tick +=
delegate { if (SplashFormInitialized != null) SplashFormInitialized(this, EventArgs.Empty); };
splashTimer.Enabled = true;
}
public event EventHandler SplashFormInitialized;
}
问题在于它现在根本不起作用。启动屏幕弹出一瞬间,品牌进度条甚至没有初始化,然后消失,而我等待10秒钟,dll和主表格一边盯着什么都显示....
让我严重困惑吧!
我实现了一个App Loading启动屏幕,该屏幕在单独的线程上运行,而所有的dll都在加载并且表单正在“绘制”。这按预期工作。奇怪的是,现在当Splash表格退出时,如果还有其他任何打开(即Outlook ),它会将我的主表单发送到后面。我在Program.cs中启动线程,
static class Program
{
public static Thread splashThread;
[STAThread]
static void Main()
{
splashThread = new Thread(doSplash);
splashThread.Start();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FrmWWCShell());
}
private static void doSplash()
{
var splashForm = new FrmSplash();
splashForm.ShowDialog();
}
}
然后,一旦我的FrmSearch_Shown事件被触发,我就结束了。
private void FrmSearch_Shown(object sender, EventArgs e)
{
Program.splashThread.Abort();
this.Show();
this.BringToFront();
}
正如您所看到的,我尝试在FrmSearch上调用Show()和/或BringToFront(),它仍然“跳”到后面。
我缺少什么?
我还能尝试什么呢?
我这么做是非常无知的,这是我的过程导致了这个吗?
我应该提前退休吗?
感谢您的任何见解!
我尝试将主表单上的TopMost属性设置为 TRUE 。这样可以防止我的表单隐藏,但它也会阻止用户查看任何其他应用程序。似乎对我有点自恋......
答案 0 :(得分:5)
首先,在主应用程序线程上完成UI工作非常重要。通过在后台线程上显示启动画面,我真的很惊讶你没有得到更严重的错误。
这是我用过的一种技术:
在启动表单上使用Application.Run而不是“真实”表单。
在你的启动表单中,有一个初始化事件:
public event EventHandler SplashFormInitialized
创建一个在一毫秒内触发的计时器,并触发该事件。
然后在您的应用程序运行方法中,您可以加载您的真实表单,然后关闭您的表单并在真实表单上执行Application.Run
var realForm = null;
var splash = new SplashForm();
splash.SplashFormInitialized += delegate {
// As long as you use a system.windows.forms.Timer in the splash form, this
// handler will be called on the UI thread
realForm = new FrmWWCShell();
//do any other init
splash.Close();
}
Application.Run(splash); //will block until the splash form is closed
Application.Run(realForm);
启动可能包括:
overrides OnLoad(...)
{
/* Using a timer will let the splash screen load and display itself before
calling this handler
*/
timer.Interval = 1;
timer.Tick += delegate {
if (SplashFormInitialized != null) SplashFormInitialized(this, EventArgs.Empty);
};
timer.Enabled = true;
}
答案 1 :(得分:0)
尝试在show之后调用Application.DoEvents()。
警告:不要经常调用DoEvents,但这是其中之一。
编辑:克莱德注意到我没有注意到的东西:你正在穿上它。不要在另一个线程上运行任何UI。取出线程,留在Application.DoEvents()。