能否不使用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
相关产品推荐
相关产品推荐

