1

编辑 2

好的,根据以下答案的建议,我消除了线程方法,现在我的程序如下所示: 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 和主窗体出现时消失,同时什么都不看......

颜色我现在严重困惑


原始帖子--> 供参考

我实现了一个应用程序加载启动画面,它在一个单独的线程上运行,而所有 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() ,但它仍然“”到后面。

我错过了什么?
我还能尝试什么?
我这样做是不是非常无知,以至于是我的过程导致了这种情况?
我应该申请提前退休吗?

感谢您的任何见解!


编辑 1

我尝试将主窗体上的 TopMost 属性设置为TRUE。这可以防止我的表单隐藏,但也可以防止用户查看任何其他应用程序。看来我有点自恋了……

4

2 回答 2

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; 
}
于 2009-05-15T16:58:38.333 回答
0

尝试在演出后立即调用 Application.DoEvents()。

警告:不要经常调用 DoEvents,但这是其中之一。

编辑:克莱德注意到我没有注意到的事情:你正在处理这个。不要在另一个线程上运行任何 UI。取出线程,留在 Application.DoEvents() 中。

于 2009-05-15T16:48:03.383 回答