Sextant.Avalonia 3.0.1
前缀已预留
dotnet add package Sextant.Avalonia --version 3.0.1
NuGet\Install-Package Sextant.Avalonia -Version 3.0.1
<PackageReference Include="Sextant.Avalonia" Version="3.0.1" />
paket add Sextant.Avalonia --version 3.0.1
#r "nuget: Sextant.Avalonia, 3.0.1"
// Install Sextant.Avalonia as a Cake Addin #addin nuget:?package=Sextant.Avalonia&version=3.0.1 // Install Sextant.Avalonia as a Cake Tool #tool nuget:?package=Sextant.Avalonia&version=3.0.1
Sextant
<p align="left"><img src="https://github.com/reactiveui/styleguide/blob/master/logo_sextant/vertical.png?raw=true" alt="Sextant" height="180px"></p>
基于 ReactiveUI 的视图模型导航库
Sextant 是从 Xamvvm 分支出来的,它是一个好用且简单的 MVVM 框架,具有优秀的导航系统。问题是,我只是想使用一个简单的导航系统与 ReactiveUI 结合使用,而不需要 MVVM 框架的所有功能。而且,我想让它更加“与 ReactiveUI 友好”。
然后出现了狂野的 Rodney Littles,并且带来了一篇令人惊叹的文章,作者是 Kent
六分仪仍处于非常初级阶段,并且处于不断变化中,所以请耐心使用...因为我们会出错。
这个库无非是我“站在巨人的肩膀上”:感谢Kent作为这个库的原始和真正的创造者,我大多数时间都是在复制粘贴 😃 Geoffrey Huntley是维护者在ReactiveUI上。
NuGet安装
在您的Forms项目和ViewModels项目上安装NuGet包。
GitHub
预发布包可在https://nuget.pkg.github.com/reactiveui/index.json找到
NuGet
平台 | 六分仪包 | NuGet |
---|---|---|
UWP | Sextant | |
Xamarin.Forms | Sextant.XamForms | |
Xamarin.Forms | Sextant.Plugins.Popup | |
Xamarin.iOS | Sextant | |
Avalonia | Sextant.Avalonia |
目标平台版本
核实您有目标平台(例如Android、iOS、Tizen)的最低版本。
注册组件
视图
2.0版本为IMutableDepedencyResolver
添加了新的扩展方法,允许您将IViewFor
注册到视图中。
Locator
.CurrentMutable
.RegisterNavigationView(() => new NavigationView(RxApp.MainThreadScheduler, RxApp.TaskpoolScheduler, ViewLocator.Current))
.RegisterParameterViewStackService()
.RegisterViewForNavigation(() => new PassPage(), () => new PassViewModel())
.RegisterViewForNavigation(() => new ReceivedPage(), () => new ReceivedViewModel());
设置初始页面
Locator
.Current
.GetService<IParameterViewStackService>()
.PushPage<PassViewModel>()
.Subscribe();
MainPage = Locator.Current.GetNavigationView("NavigationView");
使用导航服务
之后,您只需要在ViewModel中调用其中的一个方法即可。
/// <summary>
/// Pops the <see cref="IPageViewModel"/> off the stack.
/// </summary>
/// <param name="animate">if set to <c>true</c> [animate].</param>
/// <returns></returns>
IObservable<Unit> PopModal(bool animate = true);
/// <summary>
/// Pops the <see cref="IPageViewModel"/> off the stack.
/// </summary>
/// <param name="animate">if set to <c>true</c> [animate].</param>
/// <returns></returns>
IObservable<Unit> PopPage(bool animate = true);
/// <summary>
/// Pushes the <see cref="IPageViewModel"/> onto the stack.
/// </summary>
/// <param name="modal">The modal.</param>
/// <param name="contract">The contract.</param>
/// <returns></returns>
IObservable<Unit> PushModal(IPageViewModel modal, string contract = null);
/// <summary>
/// Pushes the <see cref="IPageViewModel"/> onto the stack.
/// </summary>
/// <param name="page">The page.</param>
/// <param name="contract">The contract.</param>
/// <param name="resetStack">if set to <c>true</c> [reset stack].</param>
/// <param name="animate">if set to <c>true</c> [animate].</param>
/// <returns></returns>
IObservable<Unit> PushPage(IPageViewModel page, string contract = null, bool resetStack = false, bool animate = true);
示例
public class ViewModel
{
private readonly IViewStackServicen _viewStackService; // or IParameterViewStackServicen
public ViewModel(IViewStackServicen viewStackService)
{
_viewStackService = viewStackService;
OpenModal = ReactiveCommand
// FirstModalViewModel must implement IViewModel or INavigable
.CreateFromObservable(() => viewStackService.PushModal<FirstModalViewModel>(),
outputScheduler: RxApp.MainThreadScheduler);
}
public ReactiveCommand<Unit, Unit> OpenModal { get; }
}
传递参数
2.0版本添加了对在导航时传递参数的支持。
示例
public class ViewModel
{
private readonly IParameterViewStackServicen _viewStackService;
public ViewModel(IParameterViewStackServicen viewStackService)
{
_viewStackService = viewStackService;
Navigate = ReactiveCommand
// NavigableViewModel must implement INavigable
.CreateFromObservable(() => viewStackService.PushModal<NavigableViewModel>(new NavigationParameter { { "parameter", parameter } }),
outputScheduler: RxApp.MainThreadScheduler);
}
public ReactiveCommand<Unit, Unit> Navigate { get; }
}
INavigable
接口公开了可以订阅的视图模型生命周期方法。这些方法移除了您的参数对象。实现该接口允许您在导航期间对视图模型赋值。
public class NavigableViewModel : INavigable
{
public string? _parameter;
public IObservable<Unit> WhenNavigatedFrom(INavigationParameter parameter)
{
return Observable.Return(Unit.Default)
}
public IObservable<Unit> WhenNavigatedTo(INavigationParameter parameter)
{
parameter.TryGetValue("parameter", out _parameter);
return Observable.Return(Unit.Default);
}
public IObservable<Unit> WhenNavigatingTo(INavigationParameter parameter)
{
return Observable.Return(Unit.Default);
}
}
示例
贡献
六分仪在OSI批准的开源许可证下开发,使其可以自由使用和分发,即使用于商业用途。我们 ❤ 参与这个项目的人,我们愿意让您加入我们,尤其是如果您刚刚开始或以前从未为开源做出过贡献。
所以,亲爱的想要加入我们的人——这就是您如何支持我们的方法
- 在StackOverflow上回答问题
- 传播知识和教导新一代的开发者
- 在您认为合适或者在缺乏的地方提交文档更新。
- 为代码库做出贡献。
产品 | 版本 兼容的和额外的目标框架版本。 |
---|---|
.NET | net5.0 已计算。 net5.0-windows 已计算。 net6.0 兼容。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 兼容。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。 |
.NET Core | netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。 |
.NET Standard | netstandard2.0 兼容。 netstandard2.1 已计算。 |
.NET Framework | net461 已计算。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。 |
MonoAndroid | monoandroid 已计算。 |
MonoMac | monomac 已计算。 |
MonoTouch | monotouch 已计算。 |
Tizen | tizen40 已计算。 tizen60 已计算。 |
Xamarin.iOS | xamarinios 已计算。 |
Xamarin.Mac | xamarinmac 已计算。 |
Xamarin.TVOS | xamarintvos 已计算。 |
Xamarin.WatchOS | xamarinwatchos 已计算。 |
-
.NETStandard 2.0
- Avalonia (>= 11.0.10)
- Avalonia.Desktop (>= 11.0.10)
- Avalonia.ReactiveUI (>= 11.0.10)
- ReactiveUI (>= 20.1.1)
- Sextant (>= 3.0.1)
- System.Collections.Immutable (>= 8.0.0)
- System.Threading.Tasks.Extensions (>= 4.5.4)
-
net6.0
- Avalonia (>= 11.0.10)
- Avalonia.Desktop (>= 11.0.10)
- Avalonia.ReactiveUI (>= 11.0.10)
- ReactiveUI (>= 20.1.1)
- Sextant (>= 3.0.1)
-
net8.0
- Avalonia (>= 11.0.10)
- Avalonia.Desktop (>= 11.0.10)
- Avalonia.ReactiveUI (>= 11.0.10)
- ReactiveUI (>= 20.1.1)
- Sextant (>= 3.0.1)
NuGet 包
此包未被任何 NuGet 包使用。
GitHub 仓库
此包未被任何流行的 GitHub 仓库使用。