Как приостановить обновления пользовательского интерфейса / App Shell при удалении и добавлении элемента в App Shell в Xamarin.Forms вручную? - PullRequest
1 голос
/ 10 октября 2019

Мой вопрос:

В Xamarin.Forms 4.2+ можно ли каким-либо образом приостановить оболочку приложения, пока я манипулирую ею? Или я могу приостановить макет и рендеринг всего пользовательского интерфейса для экземпляра?

Моя ситуация:

Я создаю приложение с Xamarin.Forms, где я использую новый Shell Навигация. Потому что я меняю всплывающее меню во время выполнения приложения, я хочу добавить и удалить часть кода FlyoutItem по коду.

Например, у меня есть LoginPage, который я хочу заменить на UserProfilePage в меню приложений (всплывающее меню). У меня всегда есть AppInfoPage в меню.

Всякий раз, когда я удаляю FlyoutItem, Shell хочет отобразить следующий элемент. Поэтому, когда я удаляю LoginPage, Shell отображает AppInfoPage или, по крайней мере, вызывает конструктор и выполняет перегрузку OnAppearing для AppInfoPage. OnAppearing затем делает много вещей для подготовки информации о приложении, которая теперь не нужна, потому что страница будет OnDisappearing всего через несколько тиков.

Большинство каркасов пользовательского интерфейса имеют такую ​​функцию, чтобы избежатьненужный макет и рендеринг пользовательского интерфейса. Я попытался установить IsVisible = false, IsBusy = true и вызвать BatchBegin(), но ни один из них мне не помог.

Пример кода:

Проверьте этот упрощенный пример, см. ТОДО.

 private static void SyncAppShell()
 {
    try {
            // TODO Here I want to disable the automatic "navigation on menu modification"

            Current.Items.Add(CreateFlyoutItem($"{flyoutIdPrefix}-{nameof(LoginPage)}",
                resources[nameof(AppStrings.LoginPage)],
                NavigationConstants.LoginPage,
                new LoginPage()));

            Current.Items.Add(CreateFlyoutItem($"{flyoutIdPrefix}-{nameof(AppInfo)}",
                resources[nameof(AppStrings.AppInfo)],
                NavigationConstants.AppInfo,
                new AppInfo()));

            Current.Items.Remove(_staticReferenceToLogoutPage);
    } 
    finally 
    {
         // TODO Here I want to enable the automatic "navigation on menu modification"
    }
}

private static FlyoutItem CreateFlyoutItem(string id, string title, string route, ContentPage page, bool isEnabled = true)
{
    var flyoutItem = new FlyoutItem { Title = title, StyleId = id, IsEnabled = isEnabled };
    flyoutItem.Items.Add(new ShellContent { Route = route, Content = page });
    return flyoutItem;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...