使用WPF将应用程序最小化到系统托盘(不使用NotifyIcon)

27

我已经完成了我的应用程序,现在我想为它加入“最小化到系统托盘”功能。我阅读了一篇好的文章(将应用程序最小化到系统托盘)。我发现这些使用了Windows.Form类。

不幸的是,我使用了Windows Presentation Foundation (WPF参考)来制作我的应用程序UI。现在我发现通知区域图标在WPF中不受支持。我看到CodePlex上有一个开源库可以模拟NotifyIcon属性(WPF Contrib),但我尚未使用它。

现在我陷入了困境。以下是我的问题:

a) 我不想为一个单独的组件引入第三方库。

b) 我能否在WPF上没有使用NotifyIcon实现最小化功能?如果可以,那么如何给我提供线索?

或者我应该恢复我的UI,使用Windows Forms吗?


编辑您的帖子;尝试添加像这样的链接 链接文本 - user2166576
3个回答

32
如果您重新考虑使用外部组件的抵触情绪,我建议使用 WPF NotifyIcon。我用过它,它直接简单易用且功能良好。
它不仅仅依赖于相应的 WinForms 组件,而是一种完全独立的控件,利用了 WPF 框架的多个特性以显示丰富的工具提示、弹出窗口、上下文菜单和气泡消息。

感谢@Marksl:很高兴知道它对你来说是稳定的,并且运行良好。我会等待其他人发表他们的观点。或者如果他们有其他建议。 - rockstar
对于我的项目,我计划使用ILMerge将所有程序集合并在一起。最终,WPF NotifyIcon非常小,我直接将代码复制到了项目中 - 也许不是最佳实践,但这很快。实际上它的代码量并不多。我很想看看是否还有其他方法。 - Marksl
我在我的项目中也使用了这个,效果很好。你可以剥离掉不需要的代码,只将最少量的必要代码添加到你的应用程序中。当时我也尝试了很多方法,但这是最佳解决方案。 - akjoshi
@akjoshi。感谢您宝贵的意见。我会考虑在我的应用程序中使用它。 - rockstar
4
它也可以通过NuGet获取。 - mack
未来的消息不太好,它似乎并不完全支持 DPI。在高 DPI 显示器上,弹出菜单的位置似乎没有正确放置。 - Joel Barsotti

2
我今天刚看到这篇文章。
供参考,我之前也解决了这个问题。它的效果非常好,唯一有点问题的时候是在一些多显示器设置上偶尔会出现一些问题。
这是在GIT和NuGets成为流行之前,如果有兴趣,我可以把它放在一个GIT存储库中。 CodeProject文章在这里

-1

使用System.Windows.Forms.NotifyIcon的解决方案

这里有一个帖子,对我帮助很大。

https://dev59.com/aWct5IYBdhLWcg3wAYzq#12428063

public partial class Window : System.Windows.Window{


public Window()
{
    InitializeComponent();

    System.Windows.Forms.NotifyIcon ni = new System.Windows.Forms.NotifyIcon();
    ni.Icon = new System.Drawing.Icon("Main.ico");
    ni.Visible = true;
    ni.DoubleClick += 
        delegate(object sender, EventArgs args)
        {
            this.Show();
            this.WindowState = WindowState.Normal;
        };
}

protected override void OnStateChanged(EventArgs e)
{
    if (WindowState == WindowState.Minimized)
        this.Hide();

    base.OnStateChanged(e);
}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接