gpt4 book ai didi

c# - 在单独的线程上显示 WPF -"NotifyIcon"

转载 作者:行者123 更新时间:2023-11-30 16:24:34 24 4
gpt4 key购买 nike

我目前正在开发一个 Office 插件,我需要显示一个显示进度的通知对话框,我正在使用 Philipp Sumi's wpf-notifyicon .

我需要显示 notifyicon来自一个单独的线程,因为我有很多代码已经在主线程上执行,这导致 wpf-notifyicon 阻塞并等待,因为 Windows 消息队列中的消息没有被处理。

我知道我应该在单独的线程上执行这段耗时的代码,并从主线程显示通知图标并相应地更新它,但不幸的是,这不是替代方案,因为整个解决方案是单线程的。

例子:

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

更新我已经能够使用这个更新的代码取得进一步的进展:

我正在新线程上创建 TaskbarIcon 对象,并使用 Application.Run 处理该线程上的应用程序消息循环...

    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...";
}));
}

最佳答案

我已经解决了我的问题,我必须在单独的 STA 线程上初始化 notifyIcon 并使用 Application.Run 才能开始在该线程上发送窗口消息。

        var myThread = new Thread(delegate()
{
notifyIcon = new NotifyIcon();

Application.Run();
});

myThread.SetApartmentState(ApartmentState.STA);
myThread.Start();

然后我只需要调用通知对话框的 UI。

关于c# - 在单独的线程上显示 WPF -"NotifyIcon",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10718369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com