【问题标题】:Xamarin cache pages - make it so input doesn't disappearXamarin 缓存页面 - 使其输入不会消失
【发布时间】:2020-06-14 16:10:23
【问题描述】:

我正在构建我的第一个完整的 Xamarin.Forms 应用程序,并试图弄清楚如何在导航之间保持用户输入。在网上做了一些搜索后,我读到默认行为是每次导航时完全重新加载页面,但是您可以通过将 NavigationCacheMode 设置为 true 或 required 来更改默认行为,但我尝试设置此属性在 xaml 和 C# 中都没有成功 - 似乎无法识别该属性。

有没有一种简单的方法可以让用户在页面之间导航时输入不会消失?如果有人能告诉我如何设置 NavigationCacheMode 那就太好了,但我也愿意接受任何合理的解决方案,以防止用户输入在导航期间消失。

其他详细信息:我的应用有一个 UWP 和 Android 项目。我正在使用主详细信息页面进行导航。这是我的 MenuList_ItemSelected 事件处理程序:

private void MenuList_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
    var item = (MenuItem)e.SelectedItem;
    var title = item.Title;
    var page = (Page)Activator.CreateInstance(item.TargetType);
    Detail = new NavigationPage(page); //TODO: when menu item is clicked and you're already on that page, the menu should just slide back. (currently it does nothing and stays out).
    IsPresented = false;
}

【问题讨论】:

  • 我从来没有遇到过这个问题。你是在什么平台上体验的?
  • @Jason 我会在问题中添加一些额外的细节
  • 当您说“导航”时,您的意思是从菜单中选择一个项目并调用 MenuList_ItemSelected?还是别的什么?
  • 是的,在主详细信息页面上点击/单击菜单上的项目后导航到另一个页面(也称为视图)。这会触发设置 Detail = new NavigationPage 的 MenuList_ItemSelected 事件处理程序
  • 每次你都在创建一个新的页面实例——所以用户输入当然会丢失

标签: c# xaml xamarin.forms


【解决方案1】:

终于可以解决这个问题了!我从 related post 改编了这段代码,它实现了一个跟踪导航堆栈的字典:

在我的主详细信息页面的构造函数中:

public partial class MenuPage : MasterDetailPage
{
    Dictionary<Type, Page> menuCache = new Dictionary<Type, Page>();
}

然后在ItemSelected方法中:

private void MenuList_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
    if (menuCache.Count == 0)
        menuCache.Add(typeof(AttendancePage), Detail);

    var item = (MenuItem)e.SelectedItem;
    if (item != null)
    {
        if (menuCache.ContainsKey(item.TargetType))
        { Detail = menuCache[item.TargetType]; }
        else
        {
            Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));
            menuCache.Add(item.TargetType, Detail);
        }

        menuList.SelectedItem = null; //solves issue with nav drawer not hiding when same item is selected twice
        IsPresented = false;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2017-07-13
    相关资源
    最近更新 更多