十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

WPF UI 应用生命周期完整指南:启动与退出管理最常踩的 3 个坑

WPF UI 应用生命周期完整指南:启动与退出管理最常踩的 3 个坑 WPF UI 应用生命周期完整指南启动与退出管理最常踩的 3 个坑【免费下载链接】wpfuiWPF UI provides the Fluent experience in your known and loved WPF framework. Intuitive design, themes, navigation and new immersive controls. All natively and effortlessly.项目地址: https://gitcode.com/GitHub_Trending/wp/wpfuiWPF UI 是给 WPF 框架带来 Fluent 风格体验的控件库自带 NavigationView 导航控件、双主题系统等核心功能。本文以官方 Mvvm 演示应用为主线带你完整走一遍WPF UI 应用生命周期重点解决新手最常卡住的三个问题服务注入不进去、导航调用抛异常、退出后进程残留——每个问题都先讲为什么会发生再给出能直接照做的修法。服务为什么注入不进去先查服务容器注册现象与定位现象演示应用启动即崩溃或从容器取INavigationService时得到 null报错指向Unable to resolve service。WPF UI 的演示应用不手工创建对象一切从服务容器依赖注入DI取。samples/Wpf.Ui.Demo.Mvvm/App.xaml.cs 里定义了静态IHostGeneric Host.NET 提供 DI、配置、日志的统一宿主所有服务都登记在它的ConfigureServices回调中——漏登记的服务在运行时必然解析失败。服务容器怎么注册最小必要的注册片段完整清单见上文链接文件private static readonly IHost _host Host.CreateDefaultBuilder() .ConfigureServices((context, services) { _ services.AddNavigationViewPageProvider(); _ services.AddSingletonINavigationService, NavigationService(); _ services.AddSingletonINavigationWindow, Views.MainWindow(); }) .Build();三条要点AddNavigationViewPageProvider()定义在 src/Wpf.Ui.DependencyInjection/ServiceCollectionExtensions.cs它让 NavigationView 能从容器创建页面实例是 MVVM 导航的地基。窗口与服务都按接口 → 实现注册为单例INavigationService → NavigationService实现见 src/Wpf.Ui/NavigationService.cs、INavigationWindow → Views.MainWindow。OnStartup中一句await _host.StartAsync()启动容器而AddHostedServiceApplicationHostService把创建主窗口 导航到首页放进托管服务代码见 ApplicationHostService.cs。点侧边栏 Navigate 抛异常导航服务要绑定控件为什么 Navigate 会抛异常⚠️ 现象应用能启动但点击侧边栏菜单即抛出ArgumentNullException: Value cannot be null. (Parameter NavigationControl)。定位路径是通读 src/Wpf.Ui/NavigationService.cs每个Navigate方法第一步都会调用ThrowIfNavigationControlIsNull()第 90 行附近——服务里没绑定 NavigationView 控件就直接抛异常。也就是说容器里注册服务只是把对象造出来控件绑定是另一回事漏掉它运行时就炸。构造函数里怎么绑定导航控件MainWindow.xaml.cs 的构造函数通过注入拿到服务在InitializeComponent()XAML 加载完控件之后绑定public MainWindow(ViewModels.MainWindowViewModel viewModel, INavigationService navigationService) { ViewModel viewModel; DataContext this; InitializeComponent(); navigationService.SetNavigationControl(RootNavigation); }之后任何需要跳转的类只要注入INavigationService调用Navigate(typeof(SettingsPage))即可不碰窗口与控件GoBack()同理。绑定完成后的运行效果如下主题切换后重启不生效IThemeService 加配置节运行时怎么切换主题现象切了深色主题下次启动又变回浅色或系统换主题后窗口背景不跟随。切换主题用注册的IThemeService实现 src/Wpf.Ui/ThemeService.csSetTheme(ApplicationTheme.Dark)实时切换浅/深色SetAccent(color)换强调色。另外上面MainWindow构造函数里的SystemThemeWatcher.Watch(this)底层实现 src/Wpf.Ui/Appearance/SystemThemeWatcher.cs会监听 Windows 系统主题变化自动同步窗口背景不用自己轮询。主题偏好怎么持久化演示应用用 POCO 配置模型 AppConfig.cs 存配置路径等项并在App.xaml.cs中通过services.ConfigureAppConfig(context.Configuration.GetSection(...))绑定到配置节。做法照搬即可把用户选中的主题写入配置文件启动时读回并调SetTheme偏好就固定下来了。退出后进程还残留优雅关闭与全局异常兜底退出时如何释放资源现象关掉主窗口后任务栏图标消失但进程列表里应用还在或托管服务根本没执行清理逻辑。要处理两处窗口层MainWindow.xaml.cs 重写OnClosed并调用Application.Current.Shutdown()。没有这句只要还存在别的隐藏窗口关主窗口就不会结束应用。宿主层App.xaml.cs 的OnExit事件停止宿主并释放容器private async void OnExit(object sender, ExitEventArgs e) { await _host.StopAsync(); _host.Dispose(); }StopAsync会依次触发各托管服务的StopAsync如ApplicationHostService保存配置等清理动作放在这里最稳妥。用ITaskBarServicesrc/Wpf.Ui/TaskBarService.cs在窗口图标上画的任务栏进度条退出前也应调SetState(window, TaskBarProgressState.None)复位否则图标上会残留进度动画。全局异常怎么兜底现象运行期一个未捕获异常直接闪退既无日志也无提示。在 App.xaml 的根元素上声明DispatcherUnhandledExceptionOnDispatcherUnhandledException对应处理方法在 App.xaml.cs 第 100 行。在里面记录异常、用 Snackbar 服务提示用户并按需设置e.Handled true决定是否吞掉该异常——这是整个生命周期最后一道防线。动手前先看这三步克隆仓库并运行示例git clone https://gitcode.com/GitHub_Trending/wp/wpfui打开解决方案后运行 samples/Wpf.Ui.Demo.Mvvm/。精读生命周期三件套App.xaml.cs容器与启动/退出、Services/ApplicationHostService.cs窗口激活与首屏导航、Views/MainWindow.xaml.cs控件绑定与关闭行为。官方文档入口docs/documentation/getting-started.md 与 docs/documentation/navigation-view.md控件属性与迁移问题都从这里查。【免费下载链接】wpfuiWPF UI provides the Fluent experience in your known and loved WPF framework. Intuitive design, themes, navigation and new immersive controls. All natively and effortlessly.项目地址: https://gitcode.com/GitHub_Trending/wp/wpfui创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表