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

能否不使用Xaml启动WinUI 3 C#应用?

我正遵循微软官方文档,尝试将Visual Studio标准WinUI 3空白模板中的App.xaml和App.xaml.cs文件合并简化为单个App.cs文件。

我写出了一个可编译的版本:

using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;

namespace MyApp;

public class App : Application
{
    private Window _mainWindow;

    public App() {}

    protected override void OnLaunched( LaunchActivatedEventArgs args )
    {
        Resources = new ResourceDictionary();
        Resources.MergedDictionaries.Add( new XamlControlsResources() );

        _mainWindow = new MainWindow();
        _mainWindow.Activate();
    }

    public static void Main( string[] args )
    {
        App.Start(
            ( ApplicationInitializationCallbackParams callback ) =>
            {
                new App();
            }
        );
    }
}

但该版本无法正常启动UI,调用new XamlControlsResources()时会抛出System.Runtime.InteropServices.COMException,错误信息为“未指定的错误”。

请问是否存在无需XAML,仅通过C#代码启动WinUI3/Windows App SDK/.NET应用的方法?

更新

我已采纳Jeaninez - MSFT的回答,以下是最终可正常运行的App.cs文件。该文件通过Microsoft.UI.Xaml.XamlTypeInfo.XamlControlsXamlMetaDataProvider类型实现Microsoft.UI.Xaml.Markup.IXamlMetadataProvider接口,参考了Jean推荐的C++项目实现思路。

(注意:调用Resources.MergedDictionaries.Add( new XamlControlsResources() );必须在OnLaunched重写方法内执行。如果在App构造函数中调用,会触发之前提到的System.Runtime.InteropServices.COMException。)

using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Markup;
using Microsoft.UI.Xaml.XamlTypeInfo;
using System;

namespace MyApp;

public class App : Application, IXamlMetadataProvider
{
    private Window _mainWindow;
    private XamlControlsXamlMetaDataProvider provider;

    public App() { }

    [ STAThread ]
    public static void Main( string[] args )
    {
        Application.Start(
            ( ApplicationInitializationCallbackParams callback ) =>
            {
                new App();
            }
        );
    }

    public IXamlType GetXamlType( string fullName )
    {
        return provider.GetXamlType( fullName );
    }

    public IXamlType GetXamlType( Type type )
    {
        return provider.GetXamlType( type );
    }

    public XmlnsDefinition[] GetXmlnsDefinitions()
    {
        return provider.GetXmlnsDefinitions();
    }

    protected override void OnLaunched( LaunchActivatedEventArgs args )
    {
        XamlControlsXamlMetaDataProvider.Initialize();
        provider = new();

        Resources.MergedDictionaries.Add( new XamlControlsResources() );

        _mainWindow = new MainWindow();
        _mainWindow.Activate();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:30:41