仅具有托盘图标的WPF应用程序


144

我是WPF的新手,我想知道是否有人可以给我一些指导,说明如何编写一个最小化到托盘的应用程序。这个想法是,它会定期获取RSS Feed,并在有新的feed时创建一个Toaster-Popup。

该应用程序仍应具有一个主窗口(基本上只是一个包含所有提要条目的列表),但是默认情况下应将其隐藏。

我已经开始阅读有关XAML和WPF的信息,并且我知道App.xaml中的StartupUri必须指向我的主窗口,但是我不知道执行SysTray图标和隐藏主窗口的正确方法是什么(这也表示当用户最小化窗口时,应最小化到托盘,而不是任务栏。

有什么提示吗?


3
感谢所有的建议!WPF-NotifyIcon是我要使用的,快速测试表明它非常有前途且无痛苦。
迈克尔·斯托姆

Answers:


114

2
很棒的图书馆。无法使用它!
罗布·海伊,

2
德鲁(Drew),这里的链接似乎已经失效。您是否有该库的替代链接?我进行了快速搜索,但无法确定结果是否针对同一项目。
布拉德·拉尔森

@BradLarson,网站似乎已关闭;但无论如何,该项目都可以作为Nuget软件包使用(请参见Dale的答案)
Thomas Levesque

4
尽管获得了大量投票,但该答案并不构成有用的合法堆栈溢出答案。与Stack Overflow标准相反,它实际上是仅链接的答案。请通过在答案本身中提供具体的重要信息来改善此答案。这将确保无论外部站点的状态如何,信息均可用。
埃文·拉森

107

您必须使用System.Windows.Forms中的NotifyIcon控件,或者可以使用Windows API提供的Notify Icon API。WPF不提供这样的等效项,并且已在Microsoft Connect上多次提出要求。

我在GitHub上有代码System.Windows.Forms,该代码在WPF应用程序中使用NotifyIcon组件,可以在https://github.com/wilson0x4d/Mubox/blob/master/Mubox.QuickLaunch/AppWindow.xaml.cs中查看代码

以下是摘要位:

使用ShowInTaskbar = False创建一个WPF窗口,并以不可见状态加载该窗口。

在课程级别:

private System.Windows.Forms.NotifyIcon notifyIcon = null;

在OnInitialize()期间:

notifyIcon = new System.Windows.Forms.NotifyIcon();
notifyIcon.Click += new EventHandler(notifyIcon_Click);
notifyIcon.DoubleClick += new EventHandler(notifyIcon_DoubleClick);
notifyIcon.Icon = IconHandles["QuickLaunch"];

在OnLoaded()期间:

notifyIcon.Visible = true;

并进行交互(在上方显示为notifyIcon.Click和DoubleClick):

void notifyIcon_Click(object sender, EventArgs e)
{
    ShowQuickLaunchMenu();
}

从这里您可以继续使用WPF控件和API,例如上下文菜单,弹出窗口等。

就这么简单。您并不需要WPF窗口来托管组件,这只是将其引入WPF应用程序的最便捷方法(因为Window通常是通过App.xaml定义的默认入口点),同样,您也不需要不需要WPF包装程序或第三方控件,因为可以保证任何.NET Framework安装中都存在SWF组件,该安装程序也支持WPF,因为它是.NET Framework的一部分(所有当前和将来的.NET Framework版本均基于此框架。)迄今为止,Microsoft没有迹象表明SWF支持将很快从.NET Framework中删除。

希望有帮助。

您必须使用3.0之前的框架组件来获得任务栏图标,这有点困难,但是可以理解,正如Microsoft所解释的那样,在WPF范围内没有系统托盘的概念。WPF是一种演示技术,“通知图标”是一种操作系统(不是“演示”)概念。


2
感谢您的详细解释!
迈克尔·斯托姆

4
+1,这应该是仅用于说明的选定答案。
ToastyMallows

2
最后一段的荣誉。那正是我需要知道的,而正是这种简单,有洞察力的细节水平使优秀的开发人员大吃一惊。
马修·莱顿

1
关于最后一段的有趣部分是“ WPF仅适用于Windows”现在是Microsoft的借口,因为它没有在.NET Core上实现WPF跨平台。因此,仅Windows足以显示Windows特定功能吗?
McGuireV10

1
我是唯一不喜欢WPF应用程序中对System.Windows.Forms的引用的人吗?
乔尔,

48

我最近有同样的问题。不幸的是,NotifyIcon目前仅是Windows.Forms控件,如果要使用它,则必须包括框架的这一部分。我想这取决于您是多少WPF纯粹主义者。

如果您想要一种快速简便的入门方法,请在代码项目中查看此WPF NotifyIcon控件,该控件完全不依赖WinForms NotifyIcon。似乎可以在作者的网站上NuGet软件包的形式获得更新版本。到目前为止,这似乎是我最好,最干净的方法。

  • 丰富的工具提示,而不是文字
  • WPF上下文菜单和弹出窗口
  • 命令支持和路由事件
  • 灵活的数据绑定
  • 丰富的气球消息,而不是操作系统提供的默认消息

看看这个。它也附带了一个了不起的示例应用程序,非常易于使用,并且您可以拥有漂亮的Windows Live Messenger样式WPF弹出窗口,工具提示和上下文菜单。非常适合显示RSS feed,我将其用于类似目的。


5
对于2017年的新手来说,该nuget包已过时,但以nuget.org/packages/Hardcodet.NotifyIcon.Wpf
mcy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.