0

当用户需要通知一些工作要做时,我正在尝试显示窗口。每个人都认为工作正常,但我想展示绝对最高的形式。我设置了表单属性 TopMost = true 但它不起作用,窗口仍然显示在其他表单后面。

我发现 TopMost = true 不仅仅适用于 BackgroundWorker,当我使用 Timer 类时它工作正常。我想知道为什么?任何人都可以向我解释这个吗?

这是我想做的简单示例。

    static void Main(string[] args)
    {
        try
        {
            BackgroundWorker worker = new BackgroundWorker();

            worker.DoWork += new DoWorkEventHandler(worker_DoWork);
            worker.RunWorkerAsync();

            Application.Run(new Form());
        }
        catch (Exception exp)
        {
            Console.WriteLine(exp);
        }

    }

    static void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        while (true)
        {
            System.Threading.Thread.Sleep(1000);

            if (NeedNotify())
            {
                NotifyForm myNotifyForm = new NotifyForm();

                myNotifyForm.TopMost = true;
                myNotifyForm.ShowDialog(); // NotifyForm still show behind others windows
            }
        }
    }

    private static bool NeedNotify()
    {
        return true;
    }
}
4

1 回答 1

1

在后台工作人员中创建表单会导致在不同的线程上创建表单。相反,在调用之前在主线程中创建并显示表单RunWorkerAsync

另一个问题可能是您在应用程序的主循环开始之前创建“通知”。您可以考虑重新组织您的代码,以便从主窗体的OnLoad事件启动后台工作程序。

于 2013-06-06T14:01:31.940 回答