.NET GUI 相关页面跳转方案

1. NavigationView 是 UWP,及现在winui流行的主窗口导航方式。

创建一个 NavigationView,在里面放置Frame作为右侧主要的展示窗口。

在CodeBehind中实现 NavView 的 ItemInvoked 事件。根据参数 InvokedItem (每一个Item的Content名称),或者每一Item的Tag来确定跳转。(还需处理重复跳转的情景)。

页面跳转执行:使用Frame的页面跳转方法, MainContent.Navigate(XXXPage); 窗口初始化时也需要该方法确定初始页面。

如果是WPF,不要忘记关闭 Frame 的 NavigationUIVisibility(旧时代遗老)

 

2. 带有 ReactiveUI 的 NavigationView

https://www.reactiveui.net/docs/handbook/routing.html

官方给出的是Routing 路由。使用一个 rxui:RoutedViewHost 来替代原始的Frame

在 View 中 ReactiveWindow

this.OneWayBind(ViewModel,
vm => vm.Router,
v => v.RoutedViewHost.Router).DisposeWith(d);

来绑定VM中的 RoutingState,订阅 NavigationView 的 SelectionChanged 事件,

页面跳转执行:ViewModel!.Router.NavigateAndReset.Execute(generalViewModel) 来做跳转。

if (parameter.args.SelectedItem is not NavigationViewItem { Tag: string tag }) { return; }

模版代码处理重复页面。

模版代码设置初始化

NavigationView.SetCurrentValue(NavigationView.SelectedItemProperty, null);
NavigationView.SetCurrentValue(NavigationView.SelectedItemProperty,
NavigationView.MenuItems.OfType<NavigationViewItem>().First());

在VM里new新建RoutingState

订阅 监控PageHader变化来设置不同的页面标题(与跳转无关)

Router.CurrentViewModel
.WhereNotNull()
.Select(x => x.UrlPathSegment)
.WhereNotNull()
.Subscribe(x => PageHeader = x switch
{
PageTag.General => Strings.GeneralPage_Title,
PageTag.MeCab => Strings.MeCabPage_Title,
PageTag.TTS => Strings.TTSPage_Title,
PageTag.Trans => Strings.TransPage_Title,
PageTag.About => Strings.About_Title,
_ => string.Empty
}).DisposeWith(_disposables);
 
在具体页面的VM里设制 IScreen,VM需要继承这些接口 ReactiveObject, IRoutableViewModel, IActivatableViewModel。
view也需要继承自 ReactiveUserControl

public IScreen HostScreen => throw new NotImplementedException();

public string UrlPathSegment => PageTag.About;

 

在DI关联VM和View

 Locator.CurrentMutable.Register(() => new AboutViewModel());

 Locator.CurrentMutable.Register<IViewFor<AboutViewModel>>(() => new AboutPage());

 

3. Avalonia提供的MVVM跳转

Avalonia提供Loacator,视图定位器来绑定ViewModel和View,默认视图层的命名需要为XXXView,这些东西可以在Locator里高度定制。

Avalonia可以绑定Content,绑定视图。只需要在View上绑定一个Content,在ViewModel中就可以通过切换vm来切换view。这个view被定义为一个UserControl

posted @   凌枫玖  阅读(124)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示