8.1 应用程序的结构
概述
WPF应用程序的结构设计是开发过程中的核心环节,良好的架构能够提升代码的可维护性、可扩展性和性能。本章将深入探讨WPF应用程序的典型结构,包括关键组件、分层设计以及最佳实践。
核心组件
1. App.xaml 入口点
- 作用:应用程序的启动入口,定义全局资源和生命周期事件。
- 关键配置:
<Application x:Class="MyApp.App" StartupUri="MainWindow.xaml"> <Application.Resources> <!-- 全局资源定义 --> </Application.Resources> </Application> - 事件处理:
Startup、Exit、DispatcherUnhandledException等。
2. 主窗口(MainWindow)
- 功能:应用程序的主界面容器。
- 设计模式:通常采用
Window或NavigationWindow作为基础。 - 示例结构:
<Window x:Class="MyApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <Grid> <!-- 布局和控件 --> </Grid> </Window>
3. 页面(Page)与导航
- 适用场景:多页面应用程序(如向导式界面)。
- 导航服务:通过
Frame控件或NavigationService实现。NavigationService.Navigate(new Uri("Page1.xaml", UriKind.Relative));
分层架构设计
1. 经典三层结构
| 层级 | 职责 | WPF实现示例 |
|---|---|---|
| 表示层 | UI展示和用户交互 | XAML + 代码后置 |
| 业务层 | 核心逻辑处理 | ViewModel + 服务类 |
| 数据层 | 数据存取和持久化 | Entity Framework/SQLite |
2. 模块化设计
- Prism框架示例:
protected override void ConfigureModuleCatalog() { base.ConfigureModuleCatalog(); ModuleCatalog.AddModule<ModuleA>(); ModuleCatalog.AddModule<ModuleB>(); } - 优势:支持动态加载、独立开发和测试。
关键配置文件
1. App.config
- 常用配置项:
<configuration> <runtime> <gcServer enabled="true"/> <!-- 启用服务器GC --> </runtime> <appSettings> <add key="ConnectionString" value="..."/> </appSettings> </configuration>
2. 资源字典(ResourceDictionary)
- 典型用法:
<ResourceDictionary> <Style x:Key="ButtonStyle" TargetType="Button"> <!-- 样式定义 --> </Style> </ResourceDictionary>
最佳实践
MVVM模式实施:
- 严格分离View/ViewModel
- 使用
INotifyPropertyChanged实现数据通知
依赖注入:
services.AddSingleton<IDataService, SqlDataService>();异常处理策略:
AppDomain.CurrentDomain.UnhandledException += (s, e) => { Logger.Fatal(e.ExceptionObject as Exception); };
结构示意图
graph TD
A[App.xaml] --> B[MainWindow]
B --> C[Views]
B --> D[Pages]
C --> E[UserControls]
A --> F[Resources]
F --> G[Styles]
F --> H[Templates]
A --> I[ViewModels]
I --> J[Services]
J --> K[Data Access]
常见问题
Q:如何选择Window还是Page?
A:单窗口应用用Window,需要导航功能用Page+Frame。Q:全局状态如何管理?
A:推荐使用静态类或依赖注入容器(如Autofac)。
