如何为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
相关产品推荐
相关产品推荐

