2016-08-09 52 views
1

Ich versuche, eine Windows-Anwendung, die in der Taskleiste als NotifyIcon starten und dann einige Formulare basierend auf Ereignissen und Benutzereingaben zeigt. ich Visual Studio 2013So zeigen Sie ein Formular aus einem anderen Thread als der ApplicationContext-Thread

Also, was ich tat, bin mit ist das Standardformular löschen VS erstellt und löschen Sie die Application.run() von Program.cs und tat Application.run(new MyApplicationContext()) wo MyApplicationContext eine Klasse, die ApplicationContext erstreckt, wo ich initialisieren und zeigen die NotifyIcon

Dann habe ich einen woker-Thread erstellt, der eine Datenbank nach Informationen abfragt und versucht, diese Informationen in einer anzuzeigen, die ich erstellt habe.

Wenn ich etwas tun, wie dies in dem woker Thread-Code:

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

Die Meldung zeigt in der Standardposition, und jedes UI-Element auf es erscheint transparent und ich kann

auf Desktop-see-through

Aber wenn ich im Worker-Thread Application.run(form) aufrufen funktioniert das Formular richtig und zeigt in der richtigen Position, aber es blockiert meinen Worker-Thread.

Wenn ich eine Form hätte, würde ich Invoke auf dieser Form anrufen. Aber was soll ich in meinem Fall tun?

EDIT: Als Abhilfe eingeleitet ich eine Form genannt parentForm in der MyApplicationContext dann Show rief sie dann unsichtbar gemacht. Und dann rufe ich davon an. Aber es scheint eine schmutzige Arbeit zu sein und nicht die richtige;

+1

Jeder Kommentar, warum ich die Down-Abstimmung verdiene, so dass ich zumindest verbessern könnte? – vlatkozelka

+0

Haben Sie versucht, einfach einen neuen Thread zu starten und "Application.Run (form)" auf diesem Thread auszuführen? –

Antwort

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

Ich habe es nicht getestet, aber es könnte so funktionieren.