You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:46:34