Xamarin.Forms Оболочка навигации вне визуальной иерархии - PullRequest
0 голосов
/ 30 июня 2019

У меня проблема с тем, как реализовать навигацию по страницам, которые не представлены в визуальной иерархии оболочки (определено в моем Shell xaml).

Из того, что я читал о навигации Shell вдокументы , я могу перейти к такой странице двумя способами:

  1. Используя свойство Navigation:
    Navigation.PushAsync(new TargetPage());
    
  2. Регистрация маршрута и использование URI-навигации Shell:
    Routing.RegisterRoute("targetPageRoute", typeof(TargetPage));
    
    Shell.Current.GoToAsync("targetPageRoute");
    

Оба метода сталкиваются с одной и той же проблемой: Как только вы используете любой метод для перехода на страницу за пределами визуальной иерархии, обычная навигация между элементами оболочки flyoutItems (с использованием всплывающего меню)произойдет сбой приложения с ошибкой:

System.Collections.Generic.KeyNotFoundException: The given key 'MyProject.TargetPage' was not present in the dictionary.

Как воспроизвести:

  1. Добавить два элемента в визуальную иерархию оболочки:

    <FlyoutItem Title="page 1">
        <Tab>
            <ShellContent>
                <local:Page1 />
            </ShellContent>
        </Tab>
    </FlyoutItem>
    
    <FlyoutItem Title="page 2">
        <Tab>
            <ShellContent>
                <local:Page2 />
            </ShellContent>
        </Tab>
    </FlyoutItem>
    
  2. Используйте кнопку на странице Page1 для перехода на страницу 3 (страница, не определенная выше), используя один из двух способов навигации, описанных в верхней части этого сообщения:
    private void Button_Clicked(object sender, EventArgs e) {
        Navigation.PushAsync(new Page3());
    }
    
  3. Использование всплывающей подсказкименю для навигации к Page2
  4. Используйте всплывающее меню для перехода на страницу Page 1 - приложение должно завершиться сбоем.

Я проверил это в своем основном проекте и в небольшом тестовом проекте и не могу, кажется,найти решение.Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 01 июля 2019

вы можете попробовать изменить shell.xaml следующим образом:

<FlyoutItem FlyoutDisplayOptions="AsMultipleItems">
    <Tab Title="page 1">
        <ShellContent  >
            <local:Page1 />
        </ShellContent>
    </Tab>
    <Tab Title="page 2">
        <ShellContent   >
            <local:Page2 />
        </ShellContent>
    </Tab>
</FlyoutItem>
0 голосов
/ 03 июля 2019

Вот та же проблема с github форм xamarin: https://github.com/xamarin/Xamarin.Forms/issues/6738 Кроме того, если вы прокрутите вниз, вы увидите запрос на извлечение, который фактически решает проблему (уже помогло приложение нашей компании). Вы должны реализовать пользовательский рендерер, который собирается наследовать от ShellItemRenderer, и переопределить существующий HandleFragmentUpdate (поскольку он использует закрытые поля из исходного ShellItemRendererBase, вам придется перебазировать их и здесь (не переопределять, просто скопируйте их из текущего файла xImarin android ShellItemRendererBase.cs)). НО, как предполагают официальные документы, вы не должны просто назначать этот рендерер производному ShellItem, вместо этого вам придется создавать собственный ShellRenderer с переопределением его метода CreateShellItemRenderer (поэтому он будет создавать ваш рендерер с фиксированным элементом оболочки вместо стандартного). ). Вы просто применяете это средство визуализации к пользовательскому элементу управления оболочки в формах xamarin.

Конечно, все, что вы сейчас делаете, временно, пока xamarin не выпустит новое обновление с этим исправлением ...

0 голосов
/ 01 июля 2019

Вы пытались добавить свой маршрут до установки BindingContext?Например:

public NavigationShell()
{
   Routing.RegisterRoute("targetPageRoute", typeof(TargetPage));
   BindingContext = this;
}
...