Мой вопрос:
В 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;
}