You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms安卓库存管理App:产品ID页面跳转目标页的逻辑问题

解决Xamarin.Forms中根据前置操作跳转不同页面的问题

嘿,这个场景我太熟悉了!其实咱们可以通过传递场景标识的方式,让Product ID输入页知道用户是从哪个入口进来的,从而跳转到对应的目标页面。下面给你几个实用的实现方案:

方案1:通过构造函数传递场景参数

这是最直接的方式,给ProductIdInputPage加一个标识场景的参数,在跳转过来的时候传入:

首先定义一个枚举来明确场景(也可以用字符串,但枚举更规范):

public enum ProductSelectionScenario
{
    StockMovement,
    OrderRequest
}

然后修改ProductIdInputPage的构造函数:

public partial class ProductIdInputPage : ContentPage
{
    private readonly ProductSelectionScenario _currentScenario;

    public ProductIdInputPage(ProductSelectionScenario scenario)
    {
        InitializeComponent();
        _currentScenario = scenario;
    }

    // 假设这是用户输入Product ID并确认后的方法
    private async void OnProductSelected(string productId)
    {
        switch (_currentScenario)
        {
            case ProductSelectionScenario.StockMovement:
                await Navigation.PushAsync(new DetailStockmovementPage(productId));
                break;
            case ProductSelectionScenario.OrderRequest:
                await Navigation.PushAsync(new DetailOrderPage(productId));
                break;
        }
    }
}

然后在触发跳转的按钮点击事件里,传入对应的场景:

// 库存增减按钮的点击事件
private async void OnStockMovementButtonClicked(object sender, EventArgs e)
{
    await Navigation.PushAsync(new ProductIdInputPage(ProductSelectionScenario.StockMovement));
}

// 订购新货按钮的点击事件
private async void OnOrderRequestButtonClicked(object sender, EventArgs e)
{
    await Navigation.PushAsync(new ProductIdInputPage(ProductSelectionScenario.OrderRequest));
}

方案2:利用Navigation参数传递(适合用Shell导航的场景)

如果你的项目用了Xamarin.Forms Shell,也可以通过导航参数来传递场景:

在按钮点击时带参数导航:

// 库存场景导航
await Shell.Current.GoToAsync($"//ProductIdInputPage?scenario=StockMovement");

// 订购场景导航
await Shell.Current.GoToAsync($"//ProductIdInputPage?scenario=OrderRequest");

然后在ProductIdInputPage的OnNavigatedTo方法里获取参数:

protected override async void OnNavigatedTo(NavigatedToEventArgs args)
{
    base.OnNavigatedTo(args);
    if (Shell.Current.CurrentState.Location.Queries.TryGetValue("scenario", out string scenarioStr))
    {
        if (Enum.TryParse<ProductSelectionScenario>(scenarioStr, out var scenario))
        {
            // 把scenario存起来,后续跳转用
            _currentScenario = scenario;
        }
    }
}

方案3:用MessagingCenter传递场景(解耦页面间依赖)

如果不想让ProductIdInputPage和目标页面有直接依赖,可以用MessagingCenter来通知:

在触发跳转的按钮处发送场景标识:

private void OnStockMovementButtonClicked(object sender, EventArgs e)
{
    MessagingCenter.Send(this, "ProductSelectionScenario", ProductSelectionScenario.StockMovement);
    Navigation.PushAsync(new ProductIdInputPage());
}

然后在ProductIdInputPage的构造函数里订阅消息:

public ProductIdInputPage()
{
    InitializeComponent();
    MessagingCenter.Subscribe<YourPreviousPage, ProductSelectionScenario>(this, "ProductSelectionScenario", (sender, scenario) =>
    {
        _currentScenario = scenario;
    });
}

确认产品后,根据场景发送对应的消息或者直接跳转(如果还是需要跳转的话)。

个人最推荐方案1,逻辑清晰且易于维护,适合大多数普通导航的场景。如果是Shell项目,方案2更贴合Shell的导航体系。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:16:48