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 MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...