2016-08-09 3 views
1

Я пытаюсь создать приложение Windows, которое запускается в системном трее как NotifyIcon, а затем отображает некоторые формы на основе событий и ввода пользователя. Я использую Visual Studio 2013Как показать форму из потока, отличной от потока ApplicationContext

Так что я сделал это удалить форму по умолчанию создает VS и удалить Application.run() из Program.cs и сделал Application.run(new MyApplicationContext()) где MyApplicationContext это класс, который расширяет ApplicationContext где я инициализирует и показать NotifyIcon

Затем я создал поток woker, который запрашивает базу данных для информации и пытается показать эту информацию в NotificationForm, который я создал.

Если я что-то вроде этого в коде Woker резьбы:

NotificationForm form = new form(); 
form.Top = // change the location; 
form.show(); 

Уведомление показывает, в положении по умолчанию, и любой элемент пользовательского интерфейса на нем кажется прозрачным, и я могу видеть, вплоть до рабочего стола

Но если я назову Application.run(form) в рабочем потоке, форма работает правильно и отображается в правильном положении, но она блокирует мой рабочий поток.

Если бы у меня был Form, я бы назвал Invoke на этом Form. Но что я должен делать в моем случае?

РЕДАКТИРОВАТЬ: В качестве обходного Я инициировал Form под названием parentForm в MyApplicationContext затем называется шоу на нем затем сделал его невидимым. И затем я вызываю из этого. Но это грязная работа, а не правильная;

+1

Любые комментарии, почему я заслуживаю голосования, поэтому я мог бы хотя бы улучшить? – vlatkozelka

+0

Вы пробовали просто прокручивать новый поток и запускать 'Application.Run (form);' в этом потоке? –

ответ

-1
 BackgroundWorker _backgroundWorker; 

    private void Init() 
    { 
     _backgroundWorker = new BackgroundWorker(); 
     _backgroundWorker.WorkerReportsProgress = true; 
     _backgroundWorker.ProgressChanged += _backgroundWorker_ProgressChanged; 
     _backgroundWorker.DoWork += _backgroundWorker_DoWork; 

     _backgroundWorker.RunWorkerAsync(); 
    } 

    private void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker backgroundWorker = sender as BackgroundWorker; 

     Thread.Sleep(5000); 
     backgroundWorker.ReportProgress(0); 

     Thread.Sleep(5000); 
     backgroundWorker.ReportProgress(10); 
    } 

    private void _backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     Form form = new Form(); 
     form.Text = "Percentage:" + e.ProgressPercentage.ToString(); 
     form.Show(); 
    } 

Я не тестировал его, но он может работать так.

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