2013-06-06 2 views
0

Я пытаюсь показать окно, когда пользователь должен уведомлять о какой-либо работе. Каждый думаю, что работа прекрасна, но я хочу показать абсолютную абсолютную форму. Я установил свойство формы TopMost = true, но он не работает, окно по-прежнему отображается за другими формами.Windows Form TopMost не работает с BackgroundWorker?

Я полагаю, что TopMost = true не работает только с BackgroundWorker, когда я использую Timer class, он отлично работает. Мне интересно, почему? Кто-нибудь может мне это объяснить?

Вот простой пример того, что я хочу сделать.

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; 
    } 
} 

ответ

1

Создание формы в фоновом режиме создает форму, создаваемую в другом потоке. Вместо этого создайте и покажите форму в своем основном потоке, прежде чем звонить RunWorkerAsync.

Другая проблема может возникнуть из-за того, что вы создаете «уведомление», прежде чем основной цикл приложения будет запущен. Вы можете рассмотреть возможность реорганизации своего кода, чтобы начальный рабочий стол начинался с события OnLoad основной формы.

+0

уведомление в «реальном приложении» является «внутри» почтового цикла, это пример. –

+0

, но у вас есть право с «другой нитью», я проверяю TopMost на Thread и не работает, как BackgroundWorker. спасибо –

Смежные вопросы