Can I use NotifyIcon in WPF?

19

我希望使用WPF将应用程序最小化到系统托盘。是否只有使用“NotifyIcon”才能实现这个结果?如果是,那么在WPF中使用“NotifyIcon”需要哪个命名空间?

如果可能的话,请提供一些提示,如何在我的MainWindow中使用“NotifyIcon”?

我的主窗口是,

public partial class MonthView : MetroWindow
{

    public DateTime SelectedDate { get; set; }

    public MonthView()
    {

            InitializeComponent();
            calMain.DisplayDate = DateTime.Today;
            Globals._globalController = new AppController();
            Globals._globalController.appTaskManager.setupLocal();
            Globals._globalController.setMonthViewWindow(this);

    }

    public void calItemSelectedDate(object sender, SelectionChangedEventArgs e)
    {
        DateTime d;
        if (sender is DateTime)
        {
            d = (DateTime)sender;
        }
        else
        {
            DateTime.TryParse(sender.ToString(), out d);
        }

        SelectedDate = d;

        ShowActivity(d);
     }

    public void ShowActivity(DateTime date)
    {
        DayView Activity = new DayView(date);
        Activity.Show();
        this.Hide();
    }

    private void SetButton_Click(object sender, RoutedEventArgs e)
    {
        SettingsView set = new SettingsView();
        set.Show();
        this.Hide();
    }

 }

我认为这是一个重复的问题 https://dev59.com/1Wkv5IYBdhLWcg3w9lai - Swift
3个回答

27

NotifyIcon在WPF中并没有像WinForms那样实现,但您仍然可以使用Windows Form的NotifyIcon,它位于System.Windows.Forms命名空间中。

看一下这些教程,它们可能涵盖您的需求:

简单的解决方案,直接使用NotifyIcon: http://www.abhisheksur.com/2012/08/notifyicon-with-wpf-applications.html

更高级的解决方案,基于NotifyIcon的新库,具有更多功能: http://www.codeproject.com/Articles/36468/WPF-NotifyIcon

有关NotifyIcon的更多信息,请参见此处: http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx


2
感谢您。在应用程序的引用中添加System.Windows.Forms和System.Drawing(用于图标),它可以正常工作。 - Dinesh

12

您可以在App.xaml.cs中设置NotifyIcon的代码

using System.Drawing;

namespace DDD
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        System.Windows.Forms.NotifyIcon nIcon = new System.Windows.Forms.NotifyIcon();
        public App()
        {
            nIcon.Icon = new Icon(@"path to ico");
            nIcon.Visible = true;
            nIcon.ShowBalloonTip(5000, "Title", "Text",  System.Windows.Forms.ToolTipIcon.Info);
            nIcon.Click += nIcon_Click;
        }

        void nIcon_Click(object sender, EventArgs e)
        {
            //events comes here
            MainWindow.Visibility = Visibility.Visible;
            MainWindow.WindowState = WindowState.Normal;
        }
    }
}

并且在你的Mainwindow.xaml.cs文件中:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        e.Cancel = true;
        this.Visibility = Visibility.Hidden;
    }

确保Window_Closing被绑定到主窗口的关闭事件上。

如果您“关闭”主窗口,窗口可见性将设置为隐藏,但您的应用程序仍然在运行。 只需在通知区域单击NotifyIcon,即可将窗口恢复。


6
是的,这是可能的,我在个人项目中使用它取得了成功。有一个由Philip Sumi编写的优秀控件http://www.hardcodet.net/projects/wpf-notifyicon。我精确地使用了那个,它运行得非常好,看起来也很漂亮(主观)。只需注意:请注意许可条款,检查您是否可以在您的项目中使用它。

我看到了你在描述中提到的链接。但是,我不明白我该如何在我的视图窗口中使用它? - Dinesh
@Dinesh:你需要像使用 WPF 控件一样使用它。这不是可以在短时间内解释清楚的东西。下载代码,运行示例并查看如何使用它。 - Tigran
创建NotifyIcon时,我应该使用哪个命名空间? - Dinesh
System.Windows.Forms...所有的细节和解释都在我的回答中的第一个链接中。此外,查看http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx以深入了解NotifyIcon。 - Jesper Jensen
1
@Tigran Orz,这是一个愚蠢的问题...我为此烦恼了一个下午...我按照作者的无窗口示例进行操作。但作为 WPF 的新手,我没有意识到 APP.xaml 有一个关联的 APP.xaml.cs 文件,示例代码中有一些行...现在一切都正常了... - Allan Ruin
显示剩余2条评论

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