Ich arbeite derzeit an einem Office-Add-in und ich brauche, um eine Benachrichtigung Dialog, der Fortschritt zeigt zeigen, ich bin mit Philipp Sumis wpf-notifyicon .
Ich brauche die Anzeige der Anmeldung von einem separaten Thread aus, da ich eine Menge Code habe, der bereits auf dem Hauptthread ausgeführt wird, führt dies dazu, dass das wpf-notifyicon blockiert und wartet, weil die Nachrichten in der Windows-Warteschlange nicht verarbeitet werden.
Ich weiß, dass ich diesen zeitaufwändigen Code lieber in einem separaten Thread ausführen und das Notifyicon vom Hauptthread aus anzeigen und entsprechend aktualisieren sollte, aber das ist leider keine Alternative, da diese ganze Lösung single-threaded ist.
Beispiel:
private FancyPopup fancyPopup;
private void button1_Click(object sender, EventArgs e)
{
notifyIcon = new TaskbarIcon();
notifyIcon.Icon = Resources.Led;
fancyPopup = new FancyPopup();
Thread showThread = new Thread(delegate()
{
notifyIcon.ShowCustomBalloon(fancyPopup, System.Windows.Controls.Primitives.PopupAnimation.Fade, null);
});
showThread.Start();
}
private void button2_Click(object sender, EventArgs e)
{
fancyPopup.TextB.Text = "Doing something...";
//Keep the main thread busy.
Thread.Sleep(5000);
fancyPopup.TextB.Text = "Done doing something...";
}
Update Mit diesem aktualisierten Code konnte ich ein wenig weiterkommen:
Ich erstelle das TaskbarIcon-Objekt in einem neuen Thread und verwende Application.Run, um die Anwendungsnachrichtenschleife in diesem Thread zu verarbeiten...
private FancyPopup fancyPopup;
private void button1_Click(object sender, EventArgs e)
{
Thread showThread = new Thread(delegate()
{
notifyIcon = new TaskbarIcon();
notifyIcon.Icon = Resources.Led;
fancyPopup = new FancyPopup();
notifyIcon.ShowCustomBalloon(fancyPopup, System.Windows.Controls.Primitives.PopupAnimation.Fade, null);
System.Windows.Forms.Application.Run();
});
showThread.SetApartmentState(ApartmentState.STA);
showThread.Start();
}
private void button2_Click(object sender, EventArgs e)
{
fancyPopup.Dispatcher.Invoke(new Action(delegate
{
fancyPopup.TextB.Text = "Doing something...";
}));
//Keep the main thread busy.
Thread.Sleep(5000);
fancyPopup.Dispatcher.Invoke(new Action(delegate
{
fancyPopup.TextB.Text = "Done doing something...";
}));
}