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

Mic*_*tum 141 .net c# wpf xaml

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

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

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

任何提示?

Dre*_*kes 110

WPF没有NotifyIcon.

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

http://www.hardcodet.net/uploads/2009/04/image13.png

  • 尽管有大量投票,但该答案并不构成有用的合法堆栈溢出答案。与Stack Overflow标准相反,它实际上是仅链接的答案。请通过在答案本身中提供具体的重要信息来改善此答案。这将确保无论外部站点的状态如何,信息均可用。 (4认同)
  • 神奇的图书馆.不能等待利用它! (2认同)
  • 德鲁,链接似乎在这里已经死了.你有这个图书馆的替代链接吗?我做了一个快速搜索,但无法确定结果是否适用于同一个项目. (2认同)

Sha*_*son 102

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

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

以下是摘要位:

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

在班级:

private System.Windows.Forms.NotifyIcon notifyIcon = null;
Run Code Online (Sandbox Code Playgroud)

在OnInitialize()期间:

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

在OnLoaded()期间:

notifyIcon.Visible = true;
Run Code Online (Sandbox Code Playgroud)

对于交互(显示为notifyIcon.Click和上面的DoubleClick):

void notifyIcon_Click(object sender, EventArgs e)
{
    ShowQuickLaunchMenu();
}
Run Code Online (Sandbox Code Playgroud)

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

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

希望有所帮助.

这是一个小奶酪,您必须使用3.0之前的Framework Framework来获取托盘图标,但可以理解的是,正如微软已经解释过的那样,WPF范围内没有系统托盘的概念.WPF是一种表示技术,而通知图标是一种操作系统(不是"演示")概念.

  • +1,这应该是单独解释的选定答案. (4认同)
  • 感谢您的详细解释! (2认同)
  • 对最后一段感到荣幸.这正是我需要知道的,这是一个简单,富有洞察力的细节,是一个优秀的开发人员. (2认同)

Dal*_*ale 48

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

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

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

看看这个.它还带有一个惊人的示例应用程序,非常易于使用,您可以拥有漂亮的Windows Live Messenger样式WPF弹出窗口,工具提示和上下文菜单.非常适合显示RSS提要,我将其用于类似目的.

  • 对于2017年的新人来说,nuget包已经过时,但以不同的名称发布为https://www.nuget.org/packages/Hardcodet.NotifyIcon.Wpf/ (5认同)