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

WinUI 3点击按钮调用导航切换视图时应用崩溃如何解决

WinUI 3 按钮点击触发导航崩溃修复方案

问题场景

在WinUI 3开发中,需要实现点击按钮将视图切换为SecondaryView的功能。使用Template Studio for WinUI模板搭建项目时发现:直接将视图切换逻辑写在页面构造函数中可以正常运行,但把逻辑放在Button Click点击事件函数中执行时,应用会直接崩溃。

相关复现代码

MainPage.xaml

<Grid x:Name="ContentArea">
   <TextBlock Text="Main Page"/>
   <Button Content="Press" Click="Button_Clicked"/>
</Grid>

MainPage.xaml.cs

private readonly INavigationService _navigationService;
public MainPage()
{
    ViewModel = App.GetService<MainViewModel>();
    InitializeComponent();
    _navigationService.NavigateTo(typeof(SecondaryViewModel).FullName); // 构造函数内调用正常
}

private void Button_Clicked(object sender, RoutedEventArgs e)
{
    _navigationService.NavigateTo(typeof(SecondaryViewModel).FullName); // 点击事件内调用崩溃
}

捕获到的异常相关代码

#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
     UnhandledException += (sender, e) =>
     {
          if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
     };
#endif

问题原因

核心问题是你声明的_navigationService字段从未完成实例赋值。
构造函数内的导航代码没有触发崩溃,是因为调用时页面还未完成可视化树挂载,Template Studio自带的导航逻辑会静默拦截无效导航请求,没有触发空引用异常;等页面加载完成点击按钮时,调用未赋值的null实例会直接抛出空引用错误,导致应用崩溃。

修复方法

在MainPage构造函数中,和获取ViewModel的逻辑一致,从DI容器中获取INavigationService的实例赋值给对应字段即可,修改后的构造函数代码如下:

public MainPage()
{
    ViewModel = App.GetService<MainViewModel>();
    // 补全导航服务实例赋值
    _navigationService = App.GetService<INavigationService>();
    InitializeComponent();
    // 构造函数内的导航逻辑可按需保留或删除
    // _navigationService.NavigateTo(typeof(SecondaryViewModel).FullName);
}

补全赋值后,按钮点击事件中的导航代码就可以正常运行,不会再触发崩溃。
补充说明:该写法完全符合Template Studio的模板设计规范,不需要额外修改其他导航配置。

内容的提问来源于stack exchange,提问作者Ricky Kresslein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:51:21