【问题标题】:Windows Form TopMost don't work with BackgroundWorker?Windows 窗体 TopMost 不能与 BackgroundWorker 一起使用?
【发布时间】:2013-06-06 13:37:57
【问题描述】:

当用户需要通知一些工作要做时,我正在尝试显示窗口。每个人都认为工作正常,但我想展示绝对最高的形式。我设置了表单属性 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;
    }
}

【问题讨论】:

    标签: backgroundworker topmost


    【解决方案1】:

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

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

    【讨论】:

    • “真实应用程序”中的通知是“内部”邮件循环,这是示例。
    • 但是你对“不同的线程”是正确的,我用线程检查 TopMost,它不像 BackgroundWorker 那样工作。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多