我正在使用 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) 中是否存在錯誤?
感謝您的幫助。
uj5u.com熱心網友回復:
看起來您無法在不更改 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)}");
}
歡迎評論。謝謝!
uj5u.com熱心網友回復:
我認為如果你宣告路線,你想使用它的方式,它會更好。在這里,您希望 page3 成為 page1 的子頁面,但您沒有那樣宣告它的路由。
嘗試:
Routing.RegisterRoute("page1/page3", typeof(Page3));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/411856.html
標籤:
上一篇:這個sed命令有效嗎?
下一篇:決議linux顏色控制序列
