我想快速為WPF程序添加系統匣選單

我想快速為WPF程序添加系統匣選單

常用的系統匣效果應該都能滿足了吧?而要實現這些效果,我們自己要寫的代碼真的不多

最後更新 2020/4/25 下午1:45
沙漠尽头的狼
預計閱讀 3 分鐘
分類
WPF
標籤
.NET WPF 系統匣選單

1 簡單要求

  • 使用開源控制項庫
  • 在 XAML 中宣告系統托盤選單,就像為控制項新增 ContextMenu 一樣
  • 封裝了常用命令,例如:開啟主視窗、退出應用程式等

我在 TerminalMACS 中新增了系統托盤選單,最終實現的系統托盤選單效果:

2 如何做?

【Step 1】在已建立的 WPF 專案中,新增 HandyControl 程式庫,並安裝:

你問我為什麼要使用 HC 控制項庫?先看 Demo 效果:

常用的系統托盤效果應該都能滿足了吧?而要實現這些效果,我們自己要寫的程式碼真的不多,因為 HC 已經封裝了,我們直接使用即可。

【Step 2】在視窗中新增 HandyControl 命名空間

xmlns:hc="https://handyorg.github.io/handycontrol"

【Step 3】宣告系統托盤選單關鍵的 19 行程式碼

<hc:NotifyIcon x:Name="NotifyIconContextContent"
            Text="{markup:I18n {x:Static i18NResources:Language.AppTitle}}"
            Visibility="Visible"
            Icon="/Images/logo.ico">
    <hc:NotifyIcon.ContextMenu>
        <ContextMenu>
            <MenuItem Command="hc:ControlCommands.PushMainWindow2Top" Header="{markup:I18n {x:Static i18NResources:Language.PushMainWindow2Top}}"/>
            <MenuItem Command="hc:ControlCommands.ShutdownApp" Header="{markup:I18n {x:Static i18NResources:Language.Exit}}"/>
        </ContextMenu>
    </hc:NotifyIcon.ContextMenu>
    <hc:Interaction.Triggers>
        <hc:EventTrigger EventName="Click">
            <hc:EventToCommand Command="hc:ControlCommands.PushMainWindow2Top"/>
        </hc:EventTrigger>
    </hc:Interaction.Triggers>
</hc:NotifyIcon>

上面的程式碼,一個系統托盤選單基本上算完成了,簡單說明一下:

  • NotifyIcon 為系統托盤選單控制項,Text 顯示系統托盤選單名稱,將滑鼠放在系統托盤圖示上,ToolTip 會顯示該字串,通常顯示應用程式名稱,如下圖:

  • hc:NotifyIcon.ContextMenu 用於宣告選單項目,本專案目前新增了開啟主視窗、退出應用程式兩個選單,而這兩個選單對應的命令 HC 已經封裝,方便使用。 - 另外,按一下系統托盤選單,也可彈出應用程式主視窗

【Step 4】手動關閉主視窗時,隱藏而不退出

新增了系統托盤選單後,在關閉主視窗時,應該覆寫 OnClosing 事件,隱藏主視窗,而不是直接關閉它。

protected override void OnClosing(CancelEventArgs e)
{
    this.Hide();
    e.Cancel = true;
}

3 更多參考

更多 Demo 原始碼請參考 HandyControl

本文原始碼TerminalMACS

繼續探索

延伸閱讀

更多文章
同分類 / 同標籤 2025/1/26

WPF 藉助自訂 XML 檔案實現國際化

本文詳細介紹了在WPF程式中使用自訂XML檔案實現國際化的方法,包括安裝必備NuGet套件、動態獲取語言清單、動態切換語言、在程式碼和XAML介面中使用翻譯字串等內容,同時提供了原始碼連結,幫助開發者輕鬆實現WPF應用程式的國際化。

繼續閱讀