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

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

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

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

有什么提示吗?

【问题讨论】:

    标签: c# .net wpf xaml


    【解决方案1】:

    【讨论】:

    • 很棒的图书馆。迫不及待想使用它!
    • 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 websiteNuGet package 似乎有更新的版本。到目前为止,这对我来说似乎是最好和最干净的方式。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多