Sextant 3.0.1

前缀已保留
dotnet add package Sextant --version 3.0.1                
NuGet\Install-Package Sextant -Version 3.0.1                
此命令旨在在Visual Studio的包管理器控制台中使用,因为它使用NuGet模块的Install-Package版本。
<PackageReference Include="Sextant" Version="3.0.1" />                
对于支持包引用的项目,请将此XML节点复制到项目文件以引用该包。
paket add Sextant --version 3.0.1                
#r "nuget: Sextant, 3.0.1"                
#r指令可用于F# Interactive和Polyglot Notebooks。将此复制到交互式工具或脚本的源代码中以引用包。
// Install Sextant as a Cake Addin
#addin nuget:?package=Sextant&version=3.0.1

// Install Sextant as a Cake Tool
#tool nuget:?package=Sextant&version=3.0.1                

Sextant

NuGet Stats Build Code Coverage alternate text is missing from this package README image alternate text is missing from this package README image

<p align="left"><img src="https://github.com/reactiveui/styleguide/blob/master/logo_sextant/vertical.png?raw=true" alt="Sextant" height="180px"></p>

一个基于ReactiveUI视图模型导航库

经修改衍生自[Xamvvm](https://github.com/xamvvm/xamvvm)的六分仪(Sextant)是一个简单且优秀的MVVM框架,并具有良好的导航系统。问题在于,我仅仅想要一个简单的导航系统,用于配合[ReactiveUI](https://github.com/reactiveui/ReactiveUI)使用,而不需要与其他MVVM框架伴随而来的全部内容。此外,我还希望它更加“响应式友好的”。

然后,一位野生高手[罗德尼·利特尔](https://github.com/rlittlesii)出现了,他实现了[肯特](https://github.com/kentcb)的这篇惊人的帖子

由于六分仪处于非常初级的阶段,且处于不断的变动中,所以请您对使用过程保持耐心……因为我们可能会出错。

这个库不过是我站在巨人的肩膀上:感谢[肯特](https://github.com/kentcb)是这个库的最初和真正的创造者,我几乎是照搬复制了它😃,还要感谢[杰弗里·亨特利](https://github.com/ghuntley)在[ReactiveUI](https://github.com/reactiveui/ReactiveUI)上的维护工作。

NuGet安装

在您的Forms项目和ViewModels项目中安装NuGet包。

GitHub

预发布包可以在https://nuget.pkg.github.com/reactiveui/index.json找到。

NuGet

平台 六分仪包 NuGet
UWP Sextant CoreBadge
Xamarin.Forms Sextant.XamForms XamBadge
Xamarin.Forms Sextant.Plugins.Popup PopupBadge
Xamarin.iOS Sextant CoreBadge
Avalonia Sextant.Avalonia CoreBadge

目标平台版本

请验证您有目标平台(例如,Android、iOS、Tizen)的最低版本。

注册组件

视图

2.0版增加了为IMutableDependencyResolver添加新扩展方法的功能,这使得您可以注册一个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批准的开源许可证下开发的,使其免费可用和分发,即使用于商业用途。我们喜欢参与该项目的人,并希望您也能加入我们,特别是如果您刚刚起步或者以前从未对开源项目做出过贡献。

所以,亲爱的希望加入我们的人——这就是您可以支持我们的方式

产品 兼容和额外的目标计算框架版本。
.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 已计算。 net6.0-windows10.0.17763 兼容。 net6.0-windows10.0.19041 兼容。 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-android34.0 兼容。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-ios17.2 兼容。 net8.0-maccatalyst 已计算。 net8.0-maccatalyst17.2 兼容。 net8.0-macos 已计算。 net8.0-macos14.2 兼容。 net8.0-tvos 已计算。 net8.0-tvos17.2 兼容。 net8.0-windows 已计算。 net8.0-windows10.0.17763 兼容。 net8.0-windows10.0.19041 兼容。
.NET Core netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。
.NET 标准库 netstandard2.0 兼容。 netstandard2.1 已计算。
.NET 框架 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 已计算。
兼容的目标框架
包含的目标框架(在包中)
有关 目标框架.NET 标准库 的更多信息。

NuGet 包 (6)

显示依赖 Sextant 的前 5 个 NuGet 包

下载
Sextant.XamForms

适用于Xamarin.Forms的ReactiveUI导航库

Sextant.Maui

适用于Xamarin.Forms的ReactiveUI导航库

Community.Sextant.WinUI

针对WinUI 3的ReactiveUI导航库

Community.Sextant.WinUI.Microsoft.Extensions.DependencyInjection

Community.Sextant.WinUI的Microsoft.Extensions.DependencyInjection适配器

Sextant.Avalonia

适用于Xamarin.Forms的ReactiveUI导航库

Github仓库

此包未被任何流行的GitHub仓库使用。

版本 下载 最后更新
3.0.1 269 5/27/2024
2.12.162 167 5/26/2024
2.12.120 1,476 1/25/2024
2.12.113 896 12/9/2023
2.12.112 170 12/9/2023
2.12.4 13,538 5/19/2021
2.12.3 490 5/18/2021
2.11.1 12,424 2/28/2021
2.10.1 7,197 1/22/2021
2.9.5 703 12/31/2020
2.9.4 608 12/28/2020
2.9.1 2,915 12/16/2020
2.8.1 998 11/5/2020
2.7.1 3,172 6/6/2020
2.6.1 813 5/8/2020
2.5.8 1,140 3/5/2020
2.5.1 1,220 1/6/2020
2.4.1 907 12/12/2019
2.3.9 711 12/5/2019
2.3.7 633 11/28/2019
2.3.1 653 11/21/2019
2.2.2 3,536 9/16/2019
2.2.1 683 9/6/2019
2.1.1 827 8/28/2019
2.0.6 717 8/24/2019
2.0.1 1,237 7/26/2019
1.5.5 1,249 3/20/2019
1.4.0 1,350 8/16/2018
1.4.0-unstable0003 693 8/16/2018
1.4.0-unstable0002 696 8/16/2018
1.3.0 3,134 7/20/2018
1.1.0-unstable0007 1,337 6/7/2018
1.1.0-unstable0006 881 6/7/2018
1.1.0-unstable0005 827 6/7/2018
1.1.0-unstable0004 815 6/6/2018
1.1.0-unstable0001 813 6/1/2018
0.4.0-unstable0004 891 6/1/2018
0.4.0-unstable0003 886 5/21/2018
0.4.0-unstable0002 858 4/16/2018
0.4.0-unstable0001 811 4/16/2018
0.3.4 1,047 4/16/2018
0.3.0-unstable0018 838 4/16/2018