WPF 不帶 TargetPlatformVersion 顯示 Win10 的 Toast 通知的方法

来源:https://www.cnblogs.com/lindexi/p/18333724
-Advertisement-
Play Games

前言 .NET許可權管理及快速開發框架、最好用的許可權工作流系統。 基於經典領域驅動設計的許可權管理及快速開發框架,源於Martin Fowler企業級應用開發思想及最新技術組合(SqlSugar、EF、Quartz、AutoFac、WebAPI、Swagger、Mock、NUnit、Vue2/3、Ele ...


本文將告訴大家如何在 WPF 不安裝 WindowsAppSDK 包,且不在 TargetFramework 帶上 TargetPlatformVersion 而彈出 Win10 的 Toast 通知的方法

本文這裡的 TargetPlatformVersion 指的是在 TargetFramework 裡面的內容,如下麵的代碼里的 10.0.17763.0 就是 TargetPlatformVersion 的值

  <PropertyGroup>
    <TargetFramework>net9.0-windows10.0.17763.0</TargetFramework>
  </PropertyGroup>

不帶 TargetPlatformVersion 即不在 TargetFramework 裡加上 10.0.x 的版本號

預設微軟官方推薦使用的是千年不更新的 Microsoft.Toolkit.Uwp.Notifications 庫,配合設置了 TargetPlatformVersion 至少為 10.0.17763.0 版本進行 Toast 通知

其預設推薦方法的 csproj 內容大概如下

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net9.0-windows10.0.17763.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UseWPF>true</UseWPF>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Toolkit.Uwp.Notifications" Version="7.1.3" />
  </ItemGroup>
</Project>

此方式需要引用 Microsoft.Toolkit.Uwp.Notifications 且在 TargetFramework 裡加上 10.0.17763.0 版本。其使用方法非常簡單,如下麵代碼即可彈出文本

        var builder = new ToastContentBuilder()
                .AddText("林德熙是逗比")
            ;
        builder.Show();

然而以上方法我感覺不夠清真。接下來將告訴大家一個我感覺比較清真的方法,可以只在 TargetFramework 裡面寫 net9.0-windows 不用帶 10.0.17763.0 版本

核心是使用 WPF 不安裝 WindowsAppSDK 使用 WinRT 功能的方法 這篇博客提到的方法,即可不用指定 TargetPlatformVersion 就可以使用 WinRT 的功能

正好 Toast 就是 WinRT 的功能

具體的做法是先取出 Microsoft.Windows.SDK.NET.dll 和 WinRT.Runtime.dll 兩個文件作為引用,我這裡放在了我的 C:\lindexi\Library 文件夾里,修改 csproj 引用這兩個文件,修改之後的 csproj 文件代碼如下

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net9.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

  <ItemGroup>
    <Reference Include="Microsoft.Windows.SDK.NET">
      <HintPath>C:\lindexi\Library\Microsoft.Windows.SDK.NET.dll</HintPath>
    </Reference>
    <Reference Include="WinRT.Runtime">
      <HintPath>C:\lindexi\Library\WinRT.Runtime.dll</HintPath>
    </Reference>
  </ItemGroup>
  
</Project>

如此可以看到 csproj 不需要加上 TargetPlatformVersion 的引用,也沒有 WindowsAppSDK 的引用。看起來清真,只需簡單的 <TargetFramework>net9.0-windows</TargetFramework> 即可完成。本文的方法不僅適用於 .NET 9 版本,也適用於 .NET 6 框架版本。如需使用 .NET 6 等版本,只需修改 net9.0 為 net6.0 即可

完成以上代碼之後,我在 MainWindow 的 Loaded 事件嘗試彈出通知內容。先根據 https://learn.microsoft.com/en-us/windows/apps/design/shell/tiles-and-notifications/adaptive-interactive-toasts?tabs=xml 文檔構建出 XML 代碼,我這裡的例子代碼只顯示一行文本

 <toast>
     <visual>
         <binding template='ToastText01'>
             <text id="1">顯示文本內容</text>
         </binding>
     </visual>
 </toast>

完成構建 XML 代碼之後,需要轉換為 XmlDocument 對象,代碼如下

            var xmlDocument = new XmlDocument();
            // lang=xml
            var toast = """
                      <toast>
                          <visual>
                              <binding template='ToastText01'>
                                  <text id="1">顯示文本內容</text>
                              </binding>
                          </visual>
                      </toast>
                      """;
            xmlDocument.LoadXml(xml: toast);

使用 XML 直接寫比較適合簡單的業務,可以看到以上的代碼十分簡單

上述代碼的 lang=xml 是為了讓智能提示和著色開森

除了直接編寫 XML 之外,還可以使用模版輔助,如下麵代碼,在 ToastNotificationManager 裡面獲取模版,然後在模版裡面添加內容

xmlDocument = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText01);
XmlNodeList stringElements = xmlDocument.GetElementsByTagName("text");
stringElements[0].AppendChild(xmlDocument.CreateTextNode("顯示文本內容"));

以上這兩個方式的效果都是差不多的,大家可以選自己喜歡的方式

完成基礎配置之後,接下來使用 ToastNotificationManager 將通知彈出,代碼如下

            var toastNotification = new ToastNotification(xmlDocument);
            var toastNotificationManagerForUser = ToastNotificationManager.GetDefault();
            var toastNotifier = toastNotificationManagerForUser.CreateToastNotifier(applicationId: "應用名");
            toastNotifier.Show(toastNotification);

以上代碼有一個細節是 CreateToastNotifier 需要傳入應用名,如果沒有傳入將炸異常,這是微軟設計問題

最後別忘記了在開始調用 WinRT 之前,使用 ComWrappersSupport 進行初始化

            global::WinRT.ComWrappersSupport.InitializeComWrappers();

完成之後的代碼如下

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Loaded += MainWindow_Loaded;
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        if (OperatingSystem.IsWindowsVersionAtLeast(10, 0, 15063))
        {
            global::WinRT.ComWrappersSupport.InitializeComWrappers();

            // 以下 XML 的構建,請看
            // https://learn.microsoft.com/en-us/windows/apps/design/shell/tiles-and-notifications/adaptive-interactive-toasts?tabs=xml
            var xmlDocument = new XmlDocument();
            // lang=xml
            var toast = """
                      <toast>
                          <visual>
                              <binding template='ToastText01'>
                                  <text id="1">顯示文本內容</text>
                              </binding>
                          </visual>
                      </toast>
                      """;
            xmlDocument.LoadXml(xml: toast);

            var toastNotification = new ToastNotification(xmlDocument);
            var toastNotificationManagerForUser = ToastNotificationManager.GetDefault();
            var toastNotifier = toastNotificationManagerForUser.CreateToastNotifier(applicationId: "應用名");
            toastNotifier.Show(toastNotification);
        }
    }
}

嘗試運行以上代碼,就可以看到在視窗載入之後,彈出一條通知消息

本文代碼放在 githubgitee 上,可以使用如下命令行拉取代碼。我整個代碼倉庫比較龐大,使用以下命令行可以進行部分拉取,拉取速度比較快

先創建一個空文件夾,接著使用命令行 cd 命令進入此空文件夾,在命令行裡面輸入以下代碼,即可獲取到本文的代碼

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin ffad2f4c67a9e53fb9121f5d807191a5a913098d

以上使用的是國內的 gitee 的源,如果 gitee 不能訪問,請替換為 github 的源。請在命令行繼續輸入以下代碼,將 gitee 源換成 github 源進行拉取代碼。如果依然拉取不到代碼,可以發郵件向我要代碼

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin ffad2f4c67a9e53fb9121f5d807191a5a913098d

獲取代碼之後,進入 WPFDemo/LenukelbawChejeabecacar/HeregemdibeHeaqereweganilai 文件夾,即可獲取到源代碼

更多技術博客,請參閱 博客導航

博客園博客只做備份,博客發佈就不再更新,如果想看最新博客,請訪問 https://blog.lindexi.com/

如圖片看不見,請在瀏覽器開啟不安全http內容相容

知識共用許可協議
本作品採用知識共用署名-非商業性使用-相同方式共用 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發佈,但務必保留文章署名[林德熙](https://www.cnblogs.com/lindexi)(包含鏈接:https://www.cnblogs.com/lindexi ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。如有任何疑問,請與我[聯繫](mailto:[email protected])。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄Blazor 的關鍵概念項目模板Razor 語法依賴註入註入配置HeadOutlet 組件@code 分離Blazor 調試CSS 隔離調用JavaScript 最近在學習 Blazor ,在B站上找了一個國外的課程邊看邊學習。嗯,原價¥1503的課程,大概200多美元,課程鏈接如下: B站(大 ...
  • 前言​ 推薦一個基於.NET 8 實現的通用許可權開發框架Admin.NET,前端使用Vue3/Element-plus開發。 基於.NET 8(Furion)/SqlSugar實現的通用管理平臺。整合最新技術,模塊插件式開發,前後端分離,開箱即用。 集成多租戶、緩存、數據校驗、鑒權、事件匯流排、動態A ...
  • 最近遇到一個項目,由於客戶指定了印表機型號:HP LaserJet Pro M501n ,本來想著參考網上的代碼,使用System.Management來實現對印表機狀態的查詢,測試過程中發現無論是缺紙、空閑,獲取到的統統都是空閑狀態,咨詢售後也是說無法獲取狀態,也不提供SDK;後面在社區看見可以通 ...
  • 經過2個月的詳細調研,**稀土目前缺少生產車間之間數據協同交互、缺少完整的生產工序數據協同監測和分析,無法及時瞭解生產過程和經營情況,更無法進行有效的生產過程優化。本項目推動**稀土生產環節的數字化、信息化和智能化改造,從行業、戰略、技術和市場等方案全面提升**稀土的競爭力,打造**稀土焙燒、水浸、... ...
  • 前言 在項目開發中,方法返回的結果(成功或失敗)對我們開發來說很重要。傳統方法,如通過異常來指示錯誤或使用特定的返回類型(如布爾值加輸出參數),雖然有效,但可能缺乏直觀性和靈活性。 FluentResults庫應運而生,它以一種既流暢又富有表達力的方式,極大地優化了這一過程。通過使用FluentRe ...
  • 在C#中,集合是用於存儲和操作一組數據項的數據結構。這些集合通常位於 System.Collections 和 System.Collections.Generic 命名空間中。下麵我將概述C#中幾種常用的集合類型及其特點: 1. System.Collections 命名空間中的集合 這個命名空間 ...
  • ...
  • 前言 在實際項目開發中,需求變更和項目迭代是常態。要求我們能夠迅速響應,對資料庫結構進行相應的調整,如添加新表、更新現有表結構或增加欄位等。 為了確保團隊成員之間的信息同步,實時更新和維護資料庫文檔變得至關重要。這不僅提升了資料庫的可讀性,也極大提高了開發效率和團隊協作的流暢性。 SmartSQL, ...
一周排行
    -Advertisement-
    Play Games
  • 前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...