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

如何为WinUI和UWP多目标适配UserControl?

多目标适配WinUI/UWP UserControl的简化方案

1. 条件编译指令快速区分平台代码

直接在XAML和C#代码中通过条件编译指令区分UWP与WinUI的命名空间和控件引用,无需大规模重构:

C#代码中的条件using

#if WINDOWS_APP_SDK
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
#else
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
#endif

XAML中的条件命名空间声明

先在项目的.csproj文件中开启XAML条件编译支持:

<EnableXamlCompilerDirectives>true</EnableXamlCompilerDirectives>

随后在XAML文件中使用条件指令区分平台命名空间:

<UserControl
    x:Class="YourApp.YourCustomControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
#if WINDOWS_APP_SDK
    xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
#else
    xmlns:muxc="using:Windows.UI.Xaml.Controls"
#endif>

<!-- 通用布局代码 -->
<Grid>
    <!-- 平台差异控件也可通过条件编译区分 -->
#if WINDOWS_APP_SDK
    <muxc:InfoBar Title="WinUI平台" />
#else
    <muxc:InfoBar Title="UWP平台" />
#endif
</Grid>
</UserControl>

2. 用共享项目承载核心代码

将UserControl的通用布局、核心逻辑放在**共享项目(Shared Project)**中,再创建两个分别针对UWP和WinUI的"宿主项目",仅在宿主项目中处理平台特有的依赖、资源和少量差异代码。这种方式能最大化复用代码,仅在必要节点做平台区分。

3. 自动化处理using指令

  • Visual Studio代码清理:在工具→选项→文本编辑器→C#→代码清理中配置规则,设置针对不同目标框架自动添加/移除对应命名空间,再批量清理项目代码。
  • Roslyn脚本批量替换:编写简单的Roslyn分析脚本,遍历项目C#文件,自动用条件编译包裹或替换UWP与WinUI的命名空间,实现批量处理。
  • 第三方工具:ReSharper、Rider等工具支持基于目标框架的命名空间优化,可快速统一不同平台的using引用。

4. 多目标项目配置优化

直接在项目文件中配置多目标框架,让单个项目同时编译UWP和WinUI版本:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net6.0-windows10.0.19041.0;uap10.0.19041</TargetFrameworks>
    <UseWinUI>true</UseWinUI>
    <OutputType>WinExe</OutputType>
  </PropertyGroup>
</Project>

配置完成后,Visual Studio会自动处理大部分依赖差异,仅需在代码中用条件编译处理剩余的平台特有逻辑。

注意事项

  • 优先使用UWP与WinUI通用的API(如Windows.Foundation下的类型),减少差异点
  • 对于平台特有的控件或功能,用抽象类/接口封装,再分别实现UWP和WinUI版本,通过工厂模式实例化

内容的提问来源于stack exchange,提问作者FrozenAssassine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:15:28