# Shell **Repository Path**: liang-cao/shell ## Basic Information - **Project Name**: Shell - **Description**: 用于WPF的界面导航 - **Primary Language**: C# - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-22 - **Last Updated**: 2025-10-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Shell 一个基于 WPF 的导航壳项目,采用 MVVM 架构与 DataTemplate + ViewModel 映射的方式实现页面导航。该项目定位为“纯导航壳”,右侧内容页面可以来自外部项目(引用的程序集),适合作为统一入口与导航容器。 ## 关键特性 - 双列布局:左侧 `ListView` 导航菜单,右侧 `ContentControl` 显示内容 - MVVM 导航:`MainViewModel` + `NavigationItem` 数据驱动导航 - 自动映射:通过 `DataTemplate` 将 ViewModel 自动映射到对应的 `UserControl` - 可扩展:支持引用外部项目的页面,按需注册模板即可 ## 项目结构 - `Models/NavigationItem.cs`:导航项模型(标题 + ViewModel) - `ViewModels/`:包含 `MainViewModel`、`HomeViewModel`、`SettingsViewModel`、`AboutViewModel` - `Views/`:包含 `HomeView`、`SettingsView`、`AboutView` 等示例视图 - `MainWindow.xaml`:两列布局,左侧绑定 `Items`,右侧绑定 `SelectedItem.ViewModel`,并在 `Window.Resources` 中注册 DataTemplate - `MainWindow.xaml.cs`:仅设置 `DataContext = new MainViewModel();`,不包含导航事件逻辑 ## 运行环境 - .NET 8 + WPF(Windows) ## 快速开始 - 在项目目录执行:`dotnet run` - 左侧菜单点击切换,右侧内容随选中项变化 ## 集成外部页面 如外部项目已有 ViewModel 与 View: 1. 引用外部项目程序集 2. 在 `MainWindow.xaml` 添加命名空间,例如: - `xmlns:extvm="clr-namespace:ExternalApp.ViewModels;assembly=ExternalApp"` - `xmlns:extviews="clr-namespace:ExternalApp.Views;assembly=ExternalApp"` 3. 在 `Window.Resources` 中注册 DataTemplate: - `` 4. 在 `MainViewModel.Items` 中添加导航项: - `Items.Add(new NavigationItem { Title = "外部页面", ViewModel = new extvm.SomePageViewModel() });` 若外部项目只有 View(没有 ViewModel),建议最小包装一个对应的 ViewModel,以保持 MVVM 一致性;或者将 `NavigationItem` 改为承载 `Content`(View 实例),但会弱化 MVVM。 ## 设计说明 - 选择 DataTemplate + ViewModel 映射的原因: - 符合 WPF/MVVM 最佳实践,View 与 ViewModel 解耦 - 扩展性好,新增页面只需注册模板并在集合中添加项 - 生命周期可控(复用 ViewModel 实例,避免状态丢失) - 如需更复杂导航(参数、历史、模块化等),可引入导航服务 + 依赖注入或采用 Prism 区域导航进行演进。 ## 后续规划(可选) - 导航服务与参数传递 - 插件化加载外部模块 - 菜单项统一 UserControl 封装与样式增强