Avalonia 中没有内置的 NavigationService(不像 WPF 的 Frame 或 UWP 的 Frame),但可以通过
ContentControl+ 数据绑定 + ViewModel 导航模式,实现简洁、可测试、符合 MVVM 的页面导航。核心思路是:用一个主视图容器(如
ContentControl)显示当前页面,通过切换其
Content绑定的 ViewModel(或 UserControl),驱动界面变化。
1. 基于 ViewModel 的导航(推荐)
这是最符合 Avalonia 和 MVVM 理念的方式:导航逻辑写在 ViewModel 层,View 仅负责展示。
定义一个主窗口 ViewModel(例如MainWindowViewModel),包含一个
CurrentPage属性(类型为
INotifyPropertyChanged的基类或接口,如
INavigationPage) 在主视图 XAML 中,把
ContentControl的
Content绑定到
CurrentPage为每个页面创建独立的 ViewModel(如
HomeViewModel、
SettingsViewModel),并配套对应 UserControl(如
HomeView.axaml) 使用
DataTemplates在
App.axaml或主视图中注册 ViewModel → View 映射,Avalonia 会自动选择对应视图渲染
示例(App.axaml 中注册):
2. 使用 ContentControl 手动切换内容(轻量场景)
适合简单应用或原型开发,不依赖复杂导航栈管理。
在主视图中定义ContentControl,并绑定到一个可变的
object或
Control类型属性 在 ViewModel 或代码后台中,直接 new 页面控件(如
new HomeView())并赋值给该属性 注意:手动 new 控件会绕过 DI 容器,若页面依赖服务,建议改用 ViewModel 方式 + DataTemplate
XAML 示例:
3. 支持后退/前进的导航栈(进阶)
若需类似浏览器的导航历史,可封装一个
NavigationService类: 维护一个
Stack<object></object>或
Stack<type></type>记录历史 提供
GoTo<t>()</t>、
GoBack()、
GoForward()方法 每次跳转时更新
CurrentPage并触发通知,
ContentControl自动刷新 配合
IoC(如 Splat)解析页面 ViewModel,确保依赖注入生效
4. 注意事项与技巧
避免内存泄漏:页面 ViewModel 若订阅了事件或启动了定时器,务必在IDisposable或
OnDetachedFromVisualTree中清理 路由参数传递:可通过构造 ViewModel 时传参,或定义统一的
INavigationParameter接口,由导航服务注入 过渡动画:Avalonia 支持
Transitions,可在
ContentControl上设置
ContentTransition实现淡入/滑动效果 类型安全:建议为所有页面 ViewModel 继承公共基类(如
PageViewModelBase),便于统一生命周期管理
