2017/02/07

[C#] WPF Notify Icon

開發Windows的WPF程式有個方法可以讓程式也加入右下角的工具列圖示中,就是用Notifyicon來做。

首先要先準備一張icon格式的圖片,就是要當作右下角顯示的圖。

然後把圖放在跟執行檔同一個目錄下,也可以在專案中另外建一個Image資料夾來放,只是路徑要改一下而已。
一開始要先宣告Notifyicon來用
System.Windows.Forms.NotifyIcon nIcon = new System.Windows.Forms.NotifyIcon();

在這裡碰到一個問題是找不到Forms可以用,所以要在方案總管中的參考加入參考System.Windows.Forms

接著只要在MainWindow()裡面加入這兩行,把Icon圖片抓進來,並且把顯示開關打開就可以了
nIcon.Icon = new Icon("NotifyIcon.ico");
nIcon.Visible = true;

如果圖片跟執行檔放在同一個目錄的話就不用打路徑,但如果圖片是放在專案另外一個的資料夾,就把路徑改一下就好(假如圖檔是放在上兩層之後的Image/Icon/NotifyIcon.ico)
nIcon.Icon = new Icon("../../Image/Icon/NotifyIcon.ico");

這時候如果專案沒有加入參考System.Windows.Drawing也記得要加一下

程式執行之後就會看到右下角的圖示了!

然後除了顯示icon之外,如果想要去點他來隱藏或是關掉程式也可以。
在MainWindow()加入Click事件
nIcon.DoubleClick += new System.EventHandler(NotifyIcon1_Click);

然後就可以在NotifyIcon1_Click()函式裡面寫點擊後要做的事情,例如可以點右下角圖示來關閉程式。
private void NotifyIcon1_Click(object sender, System.EventArgs e)
{          
   this.Close();
}

有時候程式視窗被隱藏起來,找不到地方可以關掉,就可以用這個小撇步來關。
另外如果想要對圖示按右鍵跑出選單的功能也可以做
先宣告ContextMenu(選單)跟MenuItem(選單選項)
System.Windows.Forms.ContextMenu nIconMenu = new System.Windows.Forms.ContextMenu();
System.Windows.Forms.MenuItem nIconMenuItem = new System.Windows.Forms.MenuItem();

在MainWindow()裡面加入選項(option 1),按下選項要做的事情,然後加入選單上
nIconMenuItem.Index = 0;
nIconMenuItem.Text = "option 1";
nIconMenuItem.Click += new System.EventHandler(nIconMenuItem1_Click);
nIconMenu.MenuItems.Add(nIconMenuItem);

最後把Menu加到Icon上面
nIcon.ContextMenu = nIconMenu;

這樣在右下角Icon上面按右鍵就會出現選單跟選項了

在選項中有加入nIconMenuItem1_Click監聽按下去要做的事情,所以在nIconMenuItem1_Click()中就可以寫按下選單中的該選項要做的事情
private void nIconMenuItem1_Click(object sender, System.EventArgs e)
{
    // Item1 click
}

如果要再多加選項(option 2)的話,就是在宣告一個MenuItem(選單選項)來用
最後附上完整程式碼:
MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Drawing;
using System.IO;

namespace Application
{
    public partial class MainWindow : Window
    {
        System.Windows.Forms.NotifyIcon nIcon = new System.Windows.Forms.NotifyIcon();
        System.Windows.Forms.ContextMenu nIconMenu = new System.Windows.Forms.ContextMenu();
        System.Windows.Forms.MenuItem nIconMenuItem1 = new System.Windows.Forms.MenuItem();
        System.Windows.Forms.MenuItem nIconMenuItem2 = new System.Windows.Forms.MenuItem();

        public MainWindow()
        {
            InitializeComponent();
            nIcon.Icon = new Icon("../../Image/Icon/NotifyIcon.ico");
            nIcon.Visible = true;
            nIcon.DoubleClick += new System.EventHandler(NotifyIcon1_Click);

            nIconMenuItem1.Index = 0;
            nIconMenuItem1.Text = "option 1";
            nIconMenuItem1.Click += new System.EventHandler(nIconMenuItem1_Click);
            nIconMenu.MenuItems.Add(nIconMenuItem1);

            nIconMenuItem2.Index = 1;
            nIconMenuItem2.Text = "option 2";
            nIconMenuItem2.Click += new System.EventHandler(nIconMenuItem2_Click);
            nIconMenu.MenuItems.Add(nIconMenuItem2);

            // put the menu on icon
            nIcon.ContextMenu = nIconMenu;
        }

        private void NotifyIcon1_Click(object sender, System.EventArgs e)
        {
            this.Close();
        }

        private void nIconMenuItem1_Click(object sender, System.EventArgs e)
        {
            MessageBox.Show("Option 1 pressed!");
        }

        private void nIconMenuItem2_Click(object sender, System.EventArgs e)
        {
            MessageBox.Show("Option 2 pressed!");
        }

    }
}


(END)

沒有留言:

張貼留言