只有托盘图标的 WPF 应用程序

Posted

技术标签:

【中文标题】只有托盘图标的 WPF 应用程序【英文标题】:WPF Application that only has a tray icon 【发布时间】:2010-12-01 03:40:36 【问题描述】:

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

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

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

有什么提示吗?

【问题讨论】:

【参考方案1】:

WPF 没有 NotifyIcon。

我的一位同事使用这个免费提供的库效果很好:

http://www.hardcodet.net/wpf-notifyicon(博文) https://bitbucket.org/hardcodet/notifyicon-wpf/src(源代码) https://www.nuget.org/packages/Hardcodet.NotifyIcon.Wpf/(NuGet 包) http://visualstudiogallery.msdn.microsoft.com/aacbc77c-4ef6-456f-80b7-1f157c2909f7/

【讨论】:

很棒的图书馆。迫不及待想使用它! Drew,链接似乎在这里失效了。你有这个图书馆的替代链接吗?我进行了快速搜索,但无法确定结果是否属于同一项目。 @BradLarson,该网站似乎已关闭;但无论如何,该项目可以作为 Nuget 包使用(参见 Dale 的回答) 尽管有大量的选票,但这个答案并不构成有用的、合法的 Stack Overflow 答案。它实际上是一个仅链接的答案,与 Stack Overflow 标准相反。请通过在答案本身中提供具体的重要信息来改进此答案。这将确保无论外部网站的状态如何,信息都是可用的。【参考方案2】:

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

我在 GitHub 上有代码,它使用 WPF 应用程序中的 System.Windows.FormsNotifyIcon 组件,可以在 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 Window 来托管组件,它只是将其引入 WPF 应用程序的最方便的方法(因为 Window 通常是通过 App.xaml 定义的默认入口点),同样,您不需要不需要 WPF Wrapper 或第 3 方控件,因为 SWF 组件保证存在于任何也具有 WPF 支持的 .NET Framework 安装中,因为它是 .NET Framework 的一部分(所有当前和未来的 .NET Framework 版本都基于它构建。)迄今为止,Microsoft 没有任何迹象表明 SWF 支持将很快从 .NET Framework 中删除。

希望对您有所帮助。

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

【讨论】:

【参考方案3】:

我最近遇到了同样的问题。不幸的是,NotifyIcon 目前只是一个 Windows.Forms 控件,如果你想使用它,你将不得不包含框架的那个部分。我想这取决于你是多少 WPF 纯粹主义者。

如果您想要一种快速简便的入门方法,请查看此WPF NotifyIcon control on the Code Project,它根本不依赖 WinForms NotifyIcon。 on the author's website 和 NuGet package 似乎有更新的版本。到目前为止,这对我来说似乎是最好和最干净的方式。

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

检查一下。它还附带了一个很棒的示例应用程序,非常易于使用,并且您可以拥有漂亮的 Windows Live Messenger 风格的 WPF 弹出窗口、工具提示和上下文菜单。非常适合显示 RSS 提要,我将它用于类似目的。

【讨论】:

以上是关于只有托盘图标的 WPF 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

wpf托盘图标问题

WPF之托盘图标的设定

WPF 托盘图标右键弹出的ContextMenu如何关闭

WPF:即使显式设置 WindowState,窗口也会保持最小化

应用程序停止后Qt关闭托盘图标

如何使 WPF 折叠到 Windows 服务框中