c# - 如何在顶部导航中没有后退按钮的情况下在 Xamarin Shell 中切换页面

标签 c# shell xamarin.forms navigation

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

这里是 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);

                }
            }
        }

我尝试在重定向到仪表板之前删除StackNavigation,如下所示:

        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它将存储在临时缓存中,因此如果您转到另一个页面并返回,它将比您第一次进入应用程序时加载得更快。

您可以测试的内容是(仅测试):

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

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

如果有效,则会有一些提示:

  • 您的页面可以包含静态文本;
  • 您的页面未在运行时获取该语言;

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

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

这个GetListOfWords是一个函数,您可以调用您的 xml 或应用程序资源或您用来更改语言的任何内容(即使是翻译器)。

现在你的wordsList(或者任何你调用它的方式)将被更新。

关于c# - 如何在顶部导航中没有后退按钮的情况下在 Xamarin Shell 中切换页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70281291/

相关文章:

c# - 替代嵌套类型的类型 Expression<Func<T>>

c# - 在窗口调整大小时调整 GridView 的大小

shell - "inplace"shell命令的包装器

bash - 如何在 key 中使用正斜杠设置环境变量

xamarin - 在 Xamarin Forms 中推送多个页面

c# - 简单注入(inject)器注册自动映射器

c# - Windows应用程序中是否有类似SESSION的东西?

shell - 第二个 www-data 是什么意思?

f# - 如何在 F# 中为 Xamarin.Forms 创建自定义渲染器

android - xamarin android 构建错误 : "Failed to create JavaTypeInfo for class"