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

VS2022中C++/WinRT添加自定义控件遇WMC9999错误求助

WMC9999内部错误:System.Xaml.XamlType无法转换为DirectUIXamlType的原因与解决

问题背景

  • 环境:VS2022 v17.12升级至17.13.2,已安装所有必要NuGet包
  • 操作流程:创建Blank App, Packaged (WinUI 3 in Desktop)项目,初始构建正常;添加Blank User Control (C++/WinRT),在其XAML中添加带命名的Button及点击事件
  • 报错情况:构建触发WMC9999内部错误,提示无法将System.Xaml.XamlType转换为Microsoft.UI.Xaml.Markup.Compiler.DirectUI.DirectUIXamlType,伴随C4100未引用参数警告;尝试清理重建、排查XAML语法均无效,且未在主页面使用该控件
  • 临时修复:改用User Control (WinUI 3)模板添加控件后,项目可正常构建,对比发现两个模板的命名空间存在差异

错误根源

核心是控件模板的XAML编译环境与WinUI 3项目不兼容:

  • Blank User Control (C++/WinRT)是通用C++/WinRT控件模板,其XAML默认依赖传统System.Xaml编译链,而非WinUI 3专属的编译上下文
  • Blank App, Packaged (WinUI 3 in Desktop)基于WinUI 3的DirectUI框架,要求XAML编译器处理Microsoft.UI.Xaml.Markup.Compiler.DirectUI类型,两者编译上下文冲突,直接导致类型转换失败
  • 即使未在主页面引用该控件,XAML编译器仍会单独编译控件的XAML文件,因此冲突依然会触发

正确解决方法

直接使用WinUI 3专属控件模板:

  • 在WinUI 3桌面打包项目中添加控件时,选择User Control (WinUI 3),而非通用的Blank User Control (C++/WinRT)
  • 该模板默认适配WinUI 3编译环境,XAML自动使用Microsoft.UI.Xaml相关命名空间,避免编译链冲突

补充说明

  • C4100警告为次要问题,通常是自动生成代码中存在未使用的参数,可通过调整项目警告等级或手动注释参数解决,但核心矛盾仍是XAML编译环境不匹配
  • 若需手动创建C++/WinRT控件,需确保XAML文件头部引用正确的WinUI 3命名空间:
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:你的项目命名空间"
    
    同时确认项目配置中启用WinUI 3的XAML编译选项

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:22:19