前言 .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);
}
}
}
嘗試運行以上代碼,就可以看到在視窗載入之後,彈出一條通知消息
本文代碼放在 github 和 gitee 上,可以使用如下命令行拉取代碼。我整個代碼倉庫比較龐大,使用以下命令行可以進行部分拉取,拉取速度比較快
先創建一個空文件夾,接著使用命令行 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])。