如何在Xamarin Shell中切换页面,而不在顶部导航中使用后退按钮



我的左菜单导航外壳中有一个选择器,它可以更改主页语言,
例如,实际上是英文的应用程序。当我更改为法语时,它会更改并重定向到带有法语文本的主页
问题是当我在导航页面中按下后退箭头时,它会返回到旧语言(英语(。

这里的外壳导航

<Shell ..>
<Shell.FlyoutHeader>
<Picker  ItemsSource="{Binding MultiLang, Mode=TwoWay}" SelectedItem="{Binding SelectedLang}">
</Picker>
</Shell.FlyoutHeader>

<ShellContent x:Name="home"
Route="main"
ContentTemplate="{DataTemplate home:Dashboard}" />
</Shell>

这就是重定向到主页的方法:

private async void ChangeLange(string lang)
{
...
Routing.RegisterRoute(nameof(Dashboard), typeof(Dashboard));
await Shell.Current.GoToAsync($"{nameof(Dashboard)}");// it redirect but with button back
RemoveStackNavigation ()
//   await Shell.Current.GoToAsync("//main"); like this , it dosent refresh the page with 
Shell.Current.FlyoutIsPresented = false; 
}

这是MVMM

public string _selectedLang;
public string  SelectedLang
{
get
{
return _selectedLang;
}
set
{
if (_selectedLang != value)
{
_selectedLang = value;
OnPropertyChanged("SelectedLang");
ChangeBuilding(value);
}
}
}

在重定向到Dashboard之前,我尝试过RemoveStackNavigation,如下所示:

public static void RemoveStackNavigation()
{
var existingPages = Shell.Current.Navigation.NavigationStack.ToList();
foreach (var page in existingPages)
{
if (page != null)
Shell.Current.Navigation.RemovePage(page);
}
}

我不太明白发生了什么,但我认为你想在滑动选择器时更改应用程序的语言。我认为问题不在于导航,而在于页面的创建方式。

例如,如果你现在运行你的应用程序,它进入Main page,它将存储在临时缓存中,所以如果你转到另一个页面并返回,它将比你第一次在应用程序中输入时加载得更快。

你可以测试的是(ONLY test(:

  • 将这个选择器结果(例如:如果是法语,则变量为1,如果是英语,则为2,等等(和这个变量作为static,只是为了它不刷新,您就丢失了这个值
  • 在主页面中,创建一个Label并设置动态文本:
switch(pickerResult):
case "1":
lblTest.Text = "french";
break;
case "2":
lblTest.Text = "English";
break;
case "3":
lblTest.Text = "Italian";
break;

并且,当你点击后退按钮时,你进入的页面现在显示为英文,创建与上面完全相同的标签,看看是否有效。

如果它有效,那么一些提示:

  • 您的页面可以包含静态文本
  • 您的页面在运行时没有获得该语言

SO,要解决这个问题,您需要创建一些List<Words>,并在选择器更改时获得正确的语言:

private void SelectedIndexChanged(sender s, EventArgs e)
{
switch(pickerResult):
case "1":
App.wordsList = GetListOfWords("french");
break;
}

这个GetListOfWords是一个函数,你可以调用你的xml或应用程序资源或任何你用来更改语言的东西(即使是翻译人员(。

现在,你的单词列表(或者你用什么方式来称呼它(将被更新。

Shell的导航堆栈有一些特殊之处。清除导航堆栈不是一个好选择。我们总是使用Routes为Shell进行导航。您需要知道哪个会生成堆栈。

  • 一个路由,它定义了作为Shell视觉层次结构一部分存在的内容的路径
  • 一页。Shell可视化层次结构中不存在的页面可以从Shell应用程序中的任何位置推送到导航堆栈上。例如,详细信息页面不会在Shell可视化层次结构中定义,但可以根据需要推送到导航堆栈中

有关更多详细信息,请查看MS文档。https://learn.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/shell/navigation

当你按下后退按钮时,覆盖后退按钮事件,然后判断进行导航的路线会更好。使用特定的路线名称返回。

更新:

编译后,我们在Xamarin Forms中调用的导航栏在运行时会变成Android的操作栏。

在LoadApplication(new App(((之后设置工具栏;在MainActivity的OnCreate中。

AndroidX.AppCompat.Widget.Toolbar toolbar
= this.FindViewById<AndroidX.AppCompat.Widget.Toolbar>(Resource.Id.toolbar);
SetSupportActionBar(toolbar);

然后重写OnOptionsItemSelected((。当您按下导航栏上的后退按钮时,会触发此事件。

public override bool OnOptionsItemSelected(IMenuItem item)
{

}

相关内容

  • 没有找到相关文章

最新更新