【问题标题】:Xamarin.Forms Shell GoToAsync is not working as expected in iOSXamarin.Forms Shell GoToAsync 在 iOS 中未按预期工作
【发布时间】:2022-01-15 07:53:36
【问题描述】:

我正在使用 Xamarin.Forms - Shell 功能。 我需要从一个选项卡(根)导航到另一个选项卡(第二级)。 该示例包含三个页面,为简单起见,我将其命名为 Page1、Page2 和 Page3。 Page1 和 Page2 是 App Shell 的主要选项卡,Page 3 是 Page1 的第二层(堆栈)。

下一个代码是 AppShell.xaml 的一部分:

  <FlyoutItem FlyoutDisplayOptions="AsMultipleItems">
     <ShellContent Route="page1" Title="Page1" ContentTemplate="{DataTemplate local:Page1}" />
     <ShellContent Route="page2" Title="Page2" ContentTemplate="{DataTemplate local:Page2}" />
</FlyoutItem>

AppShell.cs 中的构造函数是

 public AppShell()
        {
            InitializeComponent();
            Routing.RegisterRoute(nameof(Page3), typeof(Page3));
        }

第 1 页和第 3 页非常相似,只是代表两个页面。接下来是Page1.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="TestGoTo.Views.Page1"
              Title="Page1" BackgroundColor="LightGreen">
    <ContentPage.Content>
        <StackLayout>
            <Label Text="Welcome to Page1"
                VerticalOptions="CenterAndExpand" 
                HorizontalOptions="CenterAndExpand" />
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

Page2.xaml 包含一个用于调用 GoToAsync 函数的按钮

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="TestGoTo.Views.Page2"
             Title="Page2" BackgroundColor="LightYellow">
    <ContentPage.Content>
        <StackLayout>
            <Label Text="Page2" HorizontalOptions="CenterAndExpand" />
            <Button Text="GoTo" Clicked="Button_Clicked"></Button>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

Page2.cs - 按钮操作是

private async void Button_Clicked(object sender, EventArgs e)
        {
             await Shell.Current.GoToAsync($"//page1/{nameof(Page3)}");
        }

问题:

当您转到 Page2 并单击按钮时,预期的行为是在第 1 页的选项卡下显示第 3 页,但您仍然在选项卡/page2 中。如果您(手动)转到第 1 页,您将看到第 3 页的堆栈。因此,第 3 页位于正确的位置(已加载),但您没有看到它,因为您仍然在第 2 页中。

此问题仅在 iOS 中出现,Android 正常工作。

这里有什么问题? Xamarin.Forms (Shell for iOS) 中是否存在错误?

感谢您的帮助。

【问题讨论】:

    标签: c# ios shell xamarin.forms


    【解决方案1】:

    如果不更改 CurrentItem,您似乎无法导航到另一个堆栈(即使您命名它)。出于某种原因,Android 接受了,但 iOS 不接受。

    我刚刚找到了一个解决方法。我不太喜欢,但现在它正在工作。 您需要将 CurrentItem (Shell.Current.CurrentItem) 更改为要导航的选项卡。在这种情况下,我想导航到 Tab1(page1)。所以,我需要将它的 CurrentItem 更改为

      Shell.Current.CurrentItem = Shell.Current.CurrentItem.Items[0];
    

    或者我可以使用更好的方法(如果我不知道索引)。

    Shell.Current.CurrentItem = Shell.Current.CurrentItem.Items.FirstOrDefault(x => x.Title= "Page1");
    

    下面是新的按钮动作。

      private async void Button_Clicked(object sender, EventArgs e)
            {
                
                Shell.Current.CurrentItem = Shell.Current.CurrentItem.Items.FirstOrDefault(x => x.Title=="Page1");
                //Shell.Current.CurrentItem = Shell.Current.CurrentItem.Items[0];
                await Shell.Current.GoToAsync($"//page1/{nameof(Page3)}");
            }
    

    欢迎评论。谢谢!

    【讨论】:

      【解决方案2】:

      我认为,如果您声明路线以及您想要使用它的方式,它会更好。在这里,您希望 page3 成为 page1 的子页面,但您没有那样声明它的路由。

      试试:

      Routing.RegisterRoute("page1/page3", typeof(Page3));
      

      【讨论】:

      • 谢谢@ToolmakerSteve,没用。我以前试过。 Page3 已加载,但在我点击 Page1(选项卡)之前我看不到它。此问题仅在 iOS 下,Android 使用或不使用 Routing.RegisterRoute("page1/page3", typeof(Page3)); 行均可。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 2015-10-26
      • 1970-01-01
      • 2012-11-14
      相关资源
      最近更新 更多