Xamarin.forms 表单Shell将数据传递到弹出式项目视图

Xamarin.forms 表单Shell将数据传递到弹出式项目视图,xamarin.forms,xamarin.forms.shell,Xamarin.forms,Xamarin.forms.shell,我想知道如何将项目从主shell页面传递到弹出页面。或者,我想知道我是否可以在弹出页面中简单地使用对象(已经存在于主shell的作用域中)。我猜在代码背后有某种方法可以做到这一点 具体来说,我有一个登录页面(它不是shell的一部分),一旦用户登录,就可以导航到主shell。它将jasonweb令牌传递给主shell。所以我在主shell中有我需要的,我只是不知道如何在弹出页面中使用它 下面是一些代码来演示: 我有一个登录页面,其中包含一个函数,该函数接受用户名并将其传递给shell:

我想知道如何将项目从主shell页面传递到弹出页面。或者,我想知道我是否可以在弹出页面中简单地使用对象(已经存在于主shell的作用域中)。我猜在代码背后有某种方法可以做到这一点

具体来说,我有一个登录页面(它不是shell的一部分),一旦用户登录,就可以导航到主shell。它将jasonweb令牌传递给主shell。所以我在主shell中有我需要的,我只是不知道如何在弹出页面中使用它

下面是一些代码来演示:

我有一个登录页面,其中包含一个函数,该函数接受用户名并将其传递给shell:

    async void SignInProcedure(System.Object sender, System.EventArgs e)
    {
        string name = nameEntry.Text;

        if (name == "sally" || name == "Sally")
            Application.Current.MainPage = new FlyoutMainShell(name);
        else
        {
            await DisplayAlert("Login", "Login Failed", "Ok");
        }
    }
using System;
using System.Collections.Generic;
using System.Windows.Input;
using Xamarin.Forms;

namespace ShellTest
{
    public partial class FlyoutMainShell : Shell
    {

        public FlyoutMainShell(string name)
        {
            InitializeComponent();
        }
    }
}
当然,我在shell的构造函数中有一个字符串:

    async void SignInProcedure(System.Object sender, System.EventArgs e)
    {
        string name = nameEntry.Text;

        if (name == "sally" || name == "Sally")
            Application.Current.MainPage = new FlyoutMainShell(name);
        else
        {
            await DisplayAlert("Login", "Login Failed", "Ok");
        }
    }
using System;
using System.Collections.Generic;
using System.Windows.Input;
using Xamarin.Forms;

namespace ShellTest
{
    public partial class FlyoutMainShell : Shell
    {

        public FlyoutMainShell(string name)
        {
            InitializeComponent();
        }
    }
}
现在,我不知道如何在弹出式项目“page1”和“page2”中使用字符串“name”,也就是说,只在页面上显示该名称

<?xml version="1.0" encoding="UTF-8"?>
<Shell xmlns="http://xamarin.com/schemas/2014/forms"
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
       x:Class="ShellTest.FlyoutMainShell"
       xmlns:pages="clr-namespace:ShellTest">
    <Shell.FlyoutHeaderTemplate>
        <DataTemplate>
            <Grid BackgroundColor="Gray" HeightRequest="200">
                <Label Text="Here's the header!"
                       TextColor="White"
                       FontAttributes="Bold"
                       HorizontalOptions="Center"
                       VerticalOptions="Center" />
            </Grid>
        </DataTemplate>
    </Shell.FlyoutHeaderTemplate>
    <FlyoutItem x:Name="page1" Title="Go to Page 1">
        <ShellContent ContentTemplate="{DataTemplate pages:Page1}"/>
    </FlyoutItem>
    <FlyoutItem x:Name="page2" Title="Go to Page 2">
        <ShellContent ContentTemplate="{DataTemplate pages:Page2}" />
    </FlyoutItem>
</Shell>

非常感谢您的帮助

您可以使用在主Shell中存储数据,并在“page1”和“page2”中获取/使用数据:

在主Shell中,存储数据:

public FlyoutMainShell(string name)
{
    InitializeComponent();

    Preferences.Set("uesr_name", name);

}
在其他页面中,获取值:

public Page1()
{
    InitializeComponent();

    var myValue = Preferences.Get("uesr_name", "default_value");

}
您可以在用户注销时删除该值:

Preferences.Remove("uesr_name");

我的解决方案对你有用吗?如果是,请您接受(单击☑️ 在这个答案的左上角),这样我们就可以帮助更多有同样问题的人:)。是的,这很有效!