如何在.NET 6 WPF项目中兼容多TFM实现跨Windows版本通知?
兼容新旧Windows系统的WPF通知实现方案
要同时支持Win7/旧版Win10和Win10 17763+系统的通知需求,核心思路是使用通用TFM保证兼容性,通过运行时版本检测+条件编译区分通知逻辑,具体步骤如下:
1. 调整项目目标框架(TFM)
将项目文件中的TFM从net6.0-windows10.0.17763.0修改为net6.0-windows,这个TFM支持所有兼容.NET 6的Windows系统(包括Win7)。
如果需要引用Win10+专属的通知API(比如Microsoft.Toolkit.Uwp.Notifications),可以在项目文件中添加条件引用,避免旧系统不必要的依赖:
<ItemGroup Condition="'$(TargetPlatformVersion)' >= '10.0.17763.0'"> <PackageReference Include="Microsoft.Toolkit.Uwp.Notifications" Version="7.1.3" /> </ItemGroup>
2. 运行时检测Windows系统版本
在代码中准确判断当前系统是否满足Win10 17763及以上版本,以此决定使用官方Toast还是自定义通知。这里提供两种检测方式:
基础检测(适用于大部分场景)
private static bool IsEligibleForOfficialToast() { var os = Environment.OSVersion; if (os.Platform != PlatformID.Win32NT) return false; // Win10 17763+ 或 Win11 return (os.Version.Major == 10 && os.Version.Build >= 17763) || os.Version.Major >= 11; }
更精准的Win32 API检测(可选)
如果Environment.OSVersion返回结果不准确,可以调用Win32 API获取真实版本:
[StructLayout(LayoutKind.Sequential)] internal struct OSVERSIONINFOEX { public int dwOSVersionInfoSize; public int dwMajorVersion; public int dwMinorVersion; public int dwBuildNumber; public int dwPlatformId; [MarshalAs(UnmanagedType.LPWStr)] public string szCSDVersion; public ushort wServicePackMajor; public ushort wServicePackMinor; public ushort wSuiteMask; public byte wProductType; public byte wReserved; } [DllImport("ntdll.dll")] private static extern int RtlGetVersion(ref OSVERSIONINFOEX lpVersionInformation); private static bool IsEligibleForOfficialToast() { var osInfo = new OSVERSIONINFOEX { dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVERSIONINFOEX)) }; RtlGetVersion(ref osInfo); return (osInfo.dwMajorVersion == 10 && osInfo.dwBuildNumber >= 17763) || osInfo.dwMajorVersion >= 11; }
3. 实现双分支通知逻辑
通过运行时检测结果,分别执行官方Toast或自定义通知代码,同时配合条件编译避免编译错误:
首先在项目文件中添加条件编译符号:
<PropertyGroup Condition="'$(TargetPlatformVersion)' >= '10.0.17763.0'"> <DefineConstants>$(DefineConstants);WINDOWS10_TOAST_SUPPORT</DefineConstants> </PropertyGroup>
然后编写通知方法:
public void ShowNotification(string title, string content) { if (IsEligibleForOfficialToast()) { #if WINDOWS10_TOAST_SUPPORT // 官方Toast通知逻辑 new ToastContentBuilder() .AddText(title) .AddText(content) .Show(); #endif } else { // 自定义通知控件逻辑(示例:弹出WPF窗口) var customNotifyWindow = new CustomNotificationWindow(title, content); customNotifyWindow.Show(); } }
4. 兼容性测试
分别在Win7、Win10 17763以下版本、Win10 17763及以上/Win11系统中测试程序,确保两种通知方式均能正常触发,且旧系统不会出现API缺失的运行时错误。
内容的提问来源于stack exchange,提问作者Melon NG
相关产品推荐
相关产品推荐

