UWP打包的WPF .NET 6应用经URI/执行别名启动时弹出空白窗口
问题:MSIX打包WPF应用通过URI/别名启动时出现空白窗口
我将一个仅含单个按钮的WPF示例项目用Windows 10自带的makeappx打包为MSIX包,正常启动应用运行正常,但通过URI激活(WpfApp1:)或执行别名(WpfApp1.exe)启动时,会同时打开WPF主窗口与一个空白窗口,寻求原因及解决办法。
相关配置文件
Appxmanifest.xml
<?xml version="1.0" encoding="utf-8"?> <Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:uap5="http://schemas.microsoft.com/appx/manifest/uap/windows10/5" xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap rescap"> <Identity Name="WpfApp1" Publisher="CN=Something, O=Another thing, L=City, C=DK" Version="1.0.0.0" ProcessorArchitecture="x86" /> <Properties> <DisplayName>WpfApp1</DisplayName> <PublisherDisplayName>Something</PublisherDisplayName> <Logo>Images\StoreLogo.png</Logo> </Properties> <Resources> <Resource Language="EN-US" /> </Resources> <Dependencies> <TargetDeviceFamily Name="MSIXCore.Desktop" MinVersion="6.1.7601.0" MaxVersionTested="10.0.20348.0" /> <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.19041.0" MaxVersionTested="10.0.20348.0" /> </Dependencies> <Applications> <Application Id="WpfApp1" Executable="WpfApp1.exe" EntryPoint="windows.fullTrustApplication"> <Extensions> <uap5:Extension Category="windows.appExecutionAlias"> <uap5:AppExecutionAlias> <uap5:ExecutionAlias Alias="WpfApp1.exe"/> </uap5:AppExecutionAlias> </uap5:Extension> </Extensions> <uap:VisualElements BackgroundColor="#464646" DisplayName="WpfApp1" Square150x150Logo="Images\StoreLogo.png" Square44x44Logo="Images\Square44x44Logo.targetsize-24_altform-unplated.png" Description="A useful description" /> </Application> </Applications> </Package>
构建流水线打包任务
- task: PowerShell@2 displayName: 'MSIX Packaging' inputs: targetType: 'inline' script: | & 'C:\Program Files (x86)\Windows Kits\10\App Certification Kit\makeappx.exe' pack /d 'path\to\output\' /p test.msix
原因分析
空白窗口是MSIX容器在协议激活/别名启动这类非常规入口激活全信任应用时,自动创建的临时窗口。由于你的WPF应用未处理这类激活场景的窗口逻辑,系统临时窗口和应用自身主窗口同时加载,导致双窗口出现。
解决办法
1. 完善Appxmanifest的URI激活配置
在<Application>节点的<Extensions>中添加URI协议激活声明,让系统明确应用的激活入口:
<Extensions> <!-- 保留原有别名扩展 --> <uap5:Extension Category="windows.appExecutionAlias"> <uap5:AppExecutionAlias> <uap5:ExecutionAlias Alias="WpfApp1.exe"/> </uap5:AppExecutionAlias> </uap5:Extension> <!-- 添加URI激活扩展 --> <uap:Extension Category="windows.protocol"> <uap:Protocol Name="wpfapp1"> <uap:DisplayName>WpfApp1 URI Protocol</uap:DisplayName> </uap:Protocol> </uap:Extension> </Extensions>
2. 修改WPF应用代码,处理激活事件
在App.xaml.cs中重写激活相关方法,确保只加载应用主窗口,抑制系统临时窗口:
using System; using System.Windows; namespace WpfApp1 { public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { // 直接创建并显示主窗口,覆盖系统临时窗口 MainWindow = new MainWindow(); MainWindow.Show(); // 若需处理URI参数,可解析e.Args数组 // if (e.Args.Length > 0) { /* 处理参数逻辑 */ } // 不要调用base.OnStartup(e),避免重复创建窗口 } protected override void OnActivated(EventArgs e) { // 确保激活时主窗口已存在并显示 if (MainWindow == null) { MainWindow = new MainWindow(); MainWindow.Show(); } base.OnActivated(e); } } }
3. 重新打包测试
修改完成后,重新执行makeappx打包、签名、安装应用,再次测试URI激活(WpfApp1:)和别名启动(WpfApp1.exe),空白窗口将不再出现。
内容的提问来源于stack exchange,提问作者Kagemand Andersen
相关产品推荐
相关产品推荐

