Xamarin.forms: Не удается перехватить программную кнопку "Назад"

Созданный на 22 февр. 2018  ·  53Комментарии  ·  Источник: xamarin/Xamarin.Forms

Описание

Программная кнопка возврата не использует те же пути кода, что и аппаратная кнопка возврата. Это приводит к неожиданному поведению на Android (и, судя по тому, что я читал, на iOS).

Действия по воспроизведению

  1. Переопределите метод OnBackButtonPressed () на MasterDetailPage.
  2. Запустите приложение на Android и перейдите на страницу сведений в MasterDetailPage.
  3. Нажмите стрелку «Назад» на панели команд.

Ожидаемое поведение

Метод «OnBackButtonPressed ()» должен быть вызван так же, как при нажатии аппаратной кнопки «назад».

Фактическое поведение

Метод не вызывается.

Основная информация

  • Версия с проблемой:
  • Последняя известная удачная версия: Неизвестно
  • IDE: Visual Studio 2017
  • Целевая платформа платформы:

    • Android: 8.0 Oreo

    • UWP: UWP 16299 (отлично работает!)

  • Версия библиотеки поддержки Android: v7 / v4
  • Пакеты Nuget:

NETStandard.Library {2.0.1} SQLite.Net.Standard
System.ServiceModel.Primitives {4.4.1} Adapt.Model.Helpdesk
NETStandard.Library {2.0.1} Adapt.Model.Helpdesk
System.Runtime.Serialization.Pri ... {4.3.0} Adapt.Model.Helpdesk
System.ServiceModel.Http {4.4.1} Adapt.XivicClient.Standard
System.Reflection.TypeExtensions {4.4.0} Adapt.XivicClient.Standard
System.ServiceModel.Primitives {4.4.1} Adapt.XivicClient.Standard
NETStandard.Library {2.0.1} Adapt.XivicClient.Standard
System.Runtime.Serialization.Pri ... {4.3.0} Adapt.XivicClient.Standard
System.ServiceModel.Primitives {4.4.1} Adapt.Model.Common.Standard
NETStandard.Library {2.0.1} Adapt.Model.Common.Standard
System.Runtime.Serialization.Pri ... {4.3.0} Adapt.Model.Common.Standard
NETStandard.Library {2.0.1} Adapt.Presentation.Standard
Xamarin.Forms {2.5.0.280555} Adapt.Presentation.Standard
System.ServiceModel.Http {4.4.1} Adapt.XivicClient.Database.Standard
System.ServiceModel.Primitives {4.4.1} Adapt.XivicClient.Database.Standard
NETStandard.Library {2.0.1} Adapt.XivicClient.Database.Standard
System.Runtime.Serialization.Pri ... {4.3.0} Adapt.XivicClient.Database.Standard
System.ServiceModel.Primitives {4.4.1} Adapt.Model.Whakatane
NETStandard.Library {2.0.1} Adapt.Model.Whakatane
System.Runtime.Serialization.Pri ... {4.3.0} Adapt.Model.Whakatane
NETStandard.Library {2.0.1} Adapt.Business.Standard
Microsoft.CSharp {4.4.1} Adapt.Business.Standard
System.ServiceModel.Primitives {4.4.1} Adapt.Data.Generic.Standard
NETStandard.Library {2.0.1} Adapt.Data.Generic.Standard
System.Runtime.Serialization.Pri ... {4.3.0} Adapt.Data.Generic.Standard
Xamarin.Forms.Maps {2.5.0.280555} Adapt.Presentation.XamarinForms
NETStandard.Library {2.0.1} Adapt.Presentation.XamarinForms
Syncfusion.Xamarin.SfDataGrid {15.4.0.20} Adapt.Presentation.XamarinForms
Xamarin.Forms {2.5.0.280555} Adapt.Presentation.XamarinForms
Xamarin.Android.Arch.Core.Common {1.0.0} Adapt.Presentation.Android
Xamarin.Android.Arch.Lifecycle.C ... {1.0.1} Adapt.Presentation.Android
Xamarin.Android.Arch.Lifecycle.R ... {1.0.0} Adapt.Presentation.Android
Xamarin.Android.Support.Animated ... {26.1.0.1} Adapt.Presentation.Android
Xamarin.Android.Support.Annotations {26.1.0.1} Adapt.Presentation.Android
Xamarin.Android.Support.Compat {26.1.0.1} Adapt.Presentation.Android
Xamarin.Android.Support.Core.UI {26.1.0.1} Adapt.Presentation.Android
Xamarin.Android.Support.Core.Utils {26.1.0.1} Adapt.Presentation.Android
Xamarin.Android.Support.Design {26.1.0.1} Adapt.Presentation.Android
Xamarin.Android.Support.Fragment {26.1.0.1} Adapt.Presentation.Android
Xamarin.Android.Support.Media.Co ... {26.1.0.1} Adapt.Presentation.Android
Xamarin.Android.Support.Transition {26.1.0.1} Adapt.Presentation.Android
Xamarin.Android.Support.v4 {26.1.0.1} Adapt.Presentation.Android
Xamarin.Android.Support.v7.AppCo ... {26.1.0.1} Adapt.Presentation.Android
Xamarin.Android.Support.v7.CardView {26.1.0.1} Adapt.Presentation.Android
Xamarin.Android.Support.v7.Media ... {26.1.0.1} Adapt.Presentation.Android
Xamarin.Android.Support.v7.Palette {26.1.0.1} Adapt.Presentation.Android
Xamarin.Android.Support.v7.Recyc ... {26.1.0.1} Adapt.Presentation.Android
Xamarin.Android.Support.Vector.D ... {26.1.0.1} Adapt.Presentation.Android
Xamarin.Forms {2.5.0.280555} Adapt.Presentation.Android
Xamarin.Forms {2.5.0.280555} Adapt.Presentation.iOS
Microsoft.NETCore.UniversalWindo ... {6.0.7} Adapt.Presentation.UWP
Xamarin.Forms {2.5.0.280555} Adapt.Presentation.UWP
Esri.ArcGISRuntime.Xamarin.Android {100.2.0} Adapt.Presentation.Xivic.Android
Esri.ArcGISRuntime.Xamarin.Forms {100.2.0} Adapt.Presentation.Xivic.Android
Microsoft.NETCore.Platforms {2.0.1} Adapt.Presentation.Xivic.Android
NETStandard.Library {2.0.1} Adapt.Presentation.Xivic.Android
Syncfusion.Xamarin.Core {15.4.0.20} Adapt.Presentation.Xivic.Android
Syncfusion.Xamarin.GridCommon {15.4.0.20} Adapt.Presentation.Xivic.Android
Syncfusion.Xamarin.SfDataGrid {15.4.0.20} Adapt.Presentation.Xivic.Android
Syncfusion.Xamarin.SfDataGrid.An ... {15.4.0.20} Adapt.Presentation.Xivic.Android
Syncfusion.Xamarin.SfNumericTextBox {15.4.0.20} Adapt.Presentation.Xivic.Android
Syncfusion.Xamarin.SfNumericText ... {15.4.0.20} Adapt.Presentation.Xivic.Android
Xamarin.Android.Arch.Core.Common {1.0.0} Adapt.Presentation.Xivic.Android
Xamarin.Android.Arch.Lifecycle.C ... {1.0.1} Adapt.Presentation.Xivic.Android
Xamarin.Android.Arch.Lifecycle.R ... {1.0.0} Adapt.Presentation.Xivic.Android
Xamarin.Android.Support.Animated ... {26.1.0.1} Adapt.Presentation.Xivic.Android
Xamarin.Android.Support.Annotations {26.1.0.1} Adapt.Presentation.Xivic.Android
Xamarin.Android.Support.Compat {26.1.0.1} Adapt.Presentation.Xivic.Android
Xamarin.Android.Support.Core.UI {26.1.0.1} Adapt.Presentation.Xivic.Android
Xamarin.Android.Support.Core.Utils {26.1.0.1} Adapt.Presentation.Xivic.Android
Xamarin.Android.Support.Design {26.1.0.1} Adapt.Presentation.Xivic.Android
Xamarin.Android.Support.Fragment {26.1.0.1} Adapt.Presentation.Xivic.Android
Xamarin.Android.Support.Media.Co ... {26.1.0.1} Adapt.Presentation.Xivic.Android
Xamarin.Android.Support.Transition {26.1.0.1} Adapt.Presentation.Xivic.Android
Xamarin.Android.Support.v4 {26.1.0.1} Adapt.Presentation.Xivic.Android
Xamarin.Android.Support.v7.AppCo ... {26.1.0.1} Adapt.Presentation.Xivic.Android
Xamarin.Android.Support.v7.CardView {26.1.0.1} Adapt.Presentation.Xivic.Android
Xamarin.Android.Support.v7.Media ... {26.1.0.1} Adapt.Presentation.Xivic.Android
Xamarin.Android.Support.v7.Palette {26.1.0.1} Adapt.Presentation.Xivic.Android
Xamarin.Android.Support.v7.Recyc ... {26.1.0.1} Adapt.Presentation.Xivic.Android
Xamarin.Android.Support.Vector.D ... {26.1.0.1} Adapt.Presentation.Xivic.Android
Xamarin.Build.Download {0.4.7} Adapt.Presentation.Xivic.Android
Xamarin.Forms {2.5.0.280555} Adapt.Presentation.Xivic.Android
Xamarin.Forms.Maps {2.5.0.280555} Adapt.Presentation.Xivic.Android
Xamarin.GooglePlayServices.Base {60.1142.0} Adapt.Presentation.Xivic.Android
Xamarin.GooglePlayServices.Basement {60.1142.0} Adapt.Presentation.Xivic.Android
Xamarin.GooglePlayServices.Maps {60.1142.0} Adapt.Presentation.Xivic.Android
Xamarin.GooglePlayServices.Tasks {60.1142.0} Adapt.Presentation.Xivic.Android
Esri.ArcGISRuntime.Xamarin.Forms {100.2.0} Adapt.Presentation.Xivic.iOS
Esri.ArcGISRuntime.Xamarin.iOS {100.2.0} Adapt.Presentation.Xivic.iOS
Syncfusion.Xamarin.Core {15.4.0.20} Adapt.Presentation.Xivic.iOS
Syncfusion.Xamarin.GridCommon {15.4.0.20} Adapt.Presentation.Xivic.iOS
Syncfusion.Xamarin.SfDataGrid {15.4.0.20} Adapt.Presentation.Xivic.iOS
Syncfusion.Xamarin.SfNumericTextBox {15.4.0.20} Adapt.Presentation.Xivic.iOS
Xamarin.Forms {2.5.0.280555} Adapt.Presentation.Xivic.iOS
Xamarin.Forms.Maps {2.5.0.280555} Adapt.Presentation.Xivic.iOS
Esri.ArcGISRuntime.UWP {100.2.0} Adapt.Presentation.Xivic.UWP
Esri.ArcGISRuntime.Xamarin.Forms {100.2.0} Adapt.Presentation.Xivic.UWP
Microsoft.NETCore.UniversalWindo ... {6.0.7} Adapt.Presentation.Xivic.UWP
Syncfusion.Xamarin.SfDataGrid {15.4.0.20} Adapt.Presentation.Xivic.UWP
System.Runtime.Serialization.Pri ... {4.3.0} Adapt.Presentation.Xivic.UWP
Xamarin.Forms.Maps {2.5.0.280555} Adapt.Presentation.Xivic.UWP

  • Затронутые устройства: HTC U11

Ссылка на воспроизведение

Предоставлю, если спросят.

backbutton high impact proposal-open enhancement ➕

Самый полезный комментарий

Есть ли способ повысить приоритет?
У меня уже много лет есть обходные пути, которые иногда больше не работают, ...
Мой текущий обходной путь также является действительно плохим взломом с недостатками, я хотел бы навсегда удалить мои настраиваемые средства визуализации страниц навигации и исправить некоторые проблемы в процессе.

Все 53 Комментарий

У нас было подобное обсуждение здесь. Это то, что вы ищете? https://forums.xamarin.com/discussion/100287/allow-a-single-place-to-handle-back-button-requests-with-async-support

@samhouts Да, это наша проблема. Вышеупомянутый обратный вызов должен быть добавлен в кодовую базу, или существующий метод необходимо улучшить, чтобы включить события от кнопки возврата программного обеспечения.

@samhouts , эта ошибка уже принята? Это большая проблема. Какая дополнительная информация нужна?

Я согласен с тем, что OnBackButtonPressed должен обрабатывать как Hard-, так и Software-BackButtonss. Тем не менее, их обоих не так уж и сложно понять. Я писал по этой теме здесь: https://msicc.net/xamarin-forms-the-mvvmlight-toolkit-and-i-taking-control-over-the-back-buttons/

@MSiccDev Если мы продолжим работать над проблемами, представляемыми фреймворком, то это никогда не будет исправлено, и людям придется делать это самим снова и снова до тех пор, пока технология не исчезнет.

@AceCoderLaura правда с одной стороны. С другой стороны, нужно двигаться вперед. Лучше всего обойти эту проблему, но сообщить о проблеме.

Эти обходные пути нарушают работу гамбургер-меню на корневой странице ...
-.-

@AceCoderLaura Я без проблем использую его в одном из своих приложений с MD-страницей ...

@MSiccDev
Вот мой обходной путь:

public override bool OnOptionsItemSelected(IMenuItem item) 
{ 
            //If it's not the "home" button continue as usual 
            var androidHomeId = 16908332; 
            if (item.ItemId != Resource.Id.home && item.ItemId != androidHomeId) return base.OnOptionsItemSelected(item); 

            var navigation = App.MainMasterDetailPage.Detail.Navigation; 
            if (navigation.NavigationStack.Count > 1) 
            { 
                //We can go back, do the arrow functionality 
                this.OnBackPressed();
                return true;
            } 
            else 
            { 
                //We're at the root, do the hamburger functionality 
                return App.MainMasterDetailPage.IsPresented = true; 
            } 
}

@AceCoderLaura Срабатывает ли ваш OnOptionsItemSelected после нажатия кнопки перехода назад oO В моем случае ничего не произошло ... (Android)

Есть ли прогресс по этому вопросу? У меня есть несколько вложенных навигационных представлений, и было бы очень сложно исправить это в моем приложении. Я согласен с

Та же проблема. Я думаю, что довольно часто обрабатывать событие возврата в корпоративном приложении. Это должно быть исправлено как можно скорее.

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

@ddobrev Вы правы, это очень полезная функция, но, к сожалению, даже не было четко определено, как она должна работать. Кто-то упомянул об этом, но ответа не последовало:

Да, это в значительной степени наша проблема. Вышеупомянутый обратный вызов должен быть добавлен в кодовую базу, или существующий метод необходимо улучшить, чтобы включить события от кнопки возврата программного обеспечения.

Если бы это было четко определено, я бы попытался сделать пиар для его реализации.

Я не знаю почему, но в моем случае (на Android) было достаточно, чтобы добавить это в мою MainActivity

        protected override void OnPostCreate(Bundle savedInstanceState)
        {
            var toolBar = FindViewById<global::Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
            SetSupportActionBar(toolBar);

            base.OnPostCreate(savedInstanceState);
        }

При этом OnBackButtonPressed срабатывает, даже если я нажимаю аппаратную кнопку возврата и программную кнопку возврата на панели навигации. Но я не понимаю почему.

На iOS мне все еще приходилось добавлять его сам с помощью настраиваемого рендеринга страниц.

Итак, будет ли это исправлено в версии 3.6.0?

Я думаю, что он был перемещен в «Выполняется» по ошибке.

@samhouts, так что теперь ему нужна спецификация? Что по этому поводу не указано?

@ddobrev нам все еще нужно определить лучший способ раскрыть то, что хотят люди. В настоящее время OnBackButtonPressed более конкретно соответствует кнопке возврата оборудования, поэтому ее функции в большей степени связаны с этим. Многое из того, что люди хотят, - это функция OnNavigatingBack.

Просто привязать стрелку назад программного обеспечения к этому методу прямо сейчас все еще больше похоже на взлом, чем на предоставление лучшего решения.

Например, просто отказаться от OnBackButtonPressed и создать

OnHardwareBackButtonPressed и OnNavigatingBack

Что ж, в любом случае это нормально. Просто сделай это. Это было достаточно давно.

Может ли что-то подобное иметь смысл в качестве функции страницы? Было бы очень полезно, если бы мы могли наблюдать и отменять обратную навигацию (отсюда Task \

enum ReverseNavigationSourceType {
    Unspecified,
    HwButton,
    Navbar,
    Gesture
}

class ReverseNavigationEventArgs {
    public ReverseNavigationSourceType SourceType { get; }
    public object Source { get; }
}

class Page {
    public virtual Task<bool> OnNavigatingBack(ReverseNavigationEventArgs args) {
        return Task.FromResult(true);
    }
}

Второй возможный вариант, который я вижу, - это реализовать это как часть интерфейса INavigation .

РЕДАКТИРОВАТЬ: немного изменен API

Решение @pikausp мне кажется лучшим

Кроме того, я думаю, что было бы здорово расширить это и ввести что-то вроде «Состояние страницы».

Страница может быть активной или неактивной.

class PageActivationEventArgs { }
class PageDeactivationEventArgs {
    public bool IsPermanent { get; }
}
class Page {
    public virtual Task OnActivating(PageActivationEventArgs) {
        return Task.CompletedTask;
    }

    public virtual Task<bool> OnDeactivating(PageDeactivationEventArgs) {
        return Task.FromResult(true);
    }
}

Когда страница уходит от OnDeactivating вызывается IsPermanent зависит от того, хранится ли страница в стеке навигации (верно для всплывающих окон, ложно для нажатий).

Возможно, введите OnActivated и OnDeactivated , которые вызываются после завершения навигации.

Это дает разработчику большие возможности для навигации.

Что ты думаешь?

Не могли бы вы сообщить здесь о каком-либо прогрессе?

Есть ли способ повысить приоритет?
У меня уже много лет есть обходные пути, которые иногда больше не работают, ...
Мой текущий обходной путь также является действительно плохим взломом с недостатками, я хотел бы навсегда удалить мои настраиваемые средства визуализации страниц навигации и исправить некоторые проблемы в процессе.

Удар

Любое обновление по перехвату кнопки софт назад. Мы действительно боремся с этим. Ни одно решение, упомянутое в этом посте, для нас не работает.

Это действительно необходимо. Необходимость либо взломать, либо реализовать свою собственную панель инструментов - это немного излишне для такого очевидного упущения. Пожалуйста ...

Есть обновления здесь @samhouts ?
Похоже, здесь было предложено несколько высокоуровневых решений, каждое из которых дало бы нам необходимую функциональность.

Также хотелось бы иметь эту функцию.

Требуется для каждого варианта использования, который должен предотвратить потерю данных. Мне это тоже нужно, все обходные пути слишком хакерские.

Хорошо, команда, теперь мы склоняемся к описанной здесь функциональности: https://github.com/xamarin/Xamarin.Forms/issues/6971#issuecomment -574823028

Есть возражения?

@samhouts Я быстро рассмотрел связанную проблему, и, поскольку я еще не использовал оболочку, это скорее вопрос. BackButtonBehavior - это просто оболочка (с некоторыми дополнениями) вокруг команды, которая выполняется, когда пользователь пытается вернуться назад?

По сути, речь идет не о перехвате обратной навигации, а о взятии под контроль того, что именно происходит, когда пользователь пытается вернуться с помощью любого доступного метода (смахивание, кнопка навигационной панели, кнопка Android, ...). Я могу решить перейти пользователя на новую страницу вместо того, чтобы возвращаться назад, если я так решу, это правильно?

@samhouts У меня есть рабочий перехват в моем производственном приложении для iOS uwp и Android. iOS и Android с использованием настраиваемого модуля рендеринга страниц. Когда пользователь возвращается назад с помощью программной или аппаратной кнопки «Назад», я могу отобразить всплывающее окно «Отменить изменения?». Когда пользователь подтверждает запрос, выполняется обратная навигация и открывается страница, в противном случае пользователь остается на текущей странице. Я еще не считал, что смахивание также невозможно вернуться, это отсутствует в моей реализации

@samhouts - мне непонятно, как предложение позволяет перехватить кнопку возврата, чтобы добавить условный шаг.

Предложение работает так?

  • если {Shell, NaviationPage} .BackButtonCommand не назначен, кнопка «Назад» работает нормально, и переход назад происходит автоматически.
  • Если назначен {Shell, NaviationPage} .BackButtonCommand, то назад автоматически не происходит переход назад. Назначенный экземпляр ICommand может явно делать что-то подобное, в зависимости от того, используете ли вы Shell или нет.

c# async Task MyProcessBackButton(bool usingShell) { bool navigateBack = await DisplayAlert("Cancel?", "Undo changes", "Yes", "No"); var mainPage = usingShell ? (Page)Shell.Current : Application.Current.MainPage; if (mainPage is MasterDetailPage mdPage) mainPage = mdPage.Detail; if (navigateBack) await mainPage.Navigation.PopAsync(); }

Что-то подобное должно сработать для меня, но кажется громоздким. Может, я неправильно смотрю на предложение. Было бы полезно увидеть варианты использования, изложенные с примерами.

PS Как и @nschoenberg , у меня также есть перехват с пользовательскими рендерингами в моих приложениях (на NavigationPage я выполняю что-то вроде метода MyProcessBackButton, описанного выше. Приятно, что для этого предложения не требуется Shell - это упростит внедрение для наших старых приложений).

  • если {Shell, NaviationPage} .BackButtonCommand не назначен, кнопка «Назад» работает нормально, и переход назад происходит автоматически.

Вот как я представляю, как это работает, часто мы хотим, чтобы функциональность по умолчанию, если не была отменена. Это будет вести себя так же, как переопределение кнопки возврата устройства на Android и возврат true. Разве нет смысла каким-то образом копировать эту реализацию?

Может ли что-то подобное иметь смысл в качестве функции страницы? Было бы очень полезно, если бы мы могли наблюдать и отменять обратную навигацию (отсюда Task). Кроме того, может быть удобно определить причину возврата запроса.

enum ReverseNavigationSourceType {
    Unspecified,
    HwButton,
    Navbar,
    Gesture
}

class ReverseNavigationEventArgs {
    public ReverseNavigationSourceType SourceType { get; }
    public object Source { get; }
}

class Page {
    public virtual Task<bool> OnNavigatingBack(ReverseNavigationEventArgs args) {
        return Task.FromResult(true);
    }
}

Второй возможный вариант, который я вижу, - это реализовать это как часть интерфейса INavigation .

РЕДАКТИРОВАТЬ: немного изменен API

В вопросе https://github.com/xamarin/Xamarin.Forms/issues/6971#issuecomment -574823028 я не уверен, где именно будет отображаться BackButtonCommand, предоставляется только на NavigationPage? Существует ли одна реализация на содержащей NavigationPage, и все страницы, помещенные в этот стек навигации, используют одно и то же поведение? (Я не думаю, что это будет типичный вариант использования). Как отдельные страницы реализуют собственное переопределение и используют команду?

Я думаю, что приведенное выше предложение удовлетворит потребности разработчиков в переопределении каждой страницы, поскольку вызов обратной навигации - это то, что не имеет значения, часто разработчик хочет просто контролировать то, что происходит на задней панели навигации, то есть запрашивать некоторый диалог пользователя перед отправкой их на другую страницу или просто оставьте значение по умолчанию.

Я не могу говорить за всех, но у нас есть примеры в проектах, где мы реализовали некоторую функцию, которая завершается при нажатии программной кнопки, мы также переопределяем OnBackButtonPressed который вызывает ту же функцию. Две формы обратной навигации, выполняющие один и тот же код.

Все эти свойства работают так же, как и любые присоединенные свойства на NavigationPage.

https://github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Core/NavigationPage.cs#L19

Вы можете просто применить их к активной странице, и NavigationPage отреагирует. Прилагаемые свойства хороши тем, что их можно привязать, поэтому вы можете просто настроить их на странице и привязать к виртуальной машине.

<ContentPage NavigationPage.BackButtonCommand={Bindiing BackCommand}

Одним из преимуществ того, что команда просто «отключает» поведение по умолчанию, является то, что она включает асинхронную навигацию. Потому что теперь кнопка просто направляет команду, и команда может делать что угодно столько, сколько хочет, а затем она может использовать API навигации для завершения навигации, если захочет.

Сделать все это асинхронным интересно в основном из-за таких сценариев, как прокрутка назад или прокрутка для отклонения в модальном окне, потому что они изначально не являются «асинхронными», поэтому здесь мы также могли бы коснуться этих жестов, перейти к команде и отменить жест.

Мы также могли бы сделать его событием в классе Navigation, которое могло бы запускать весь иерархический прокси, а затем с событием, которое вы могли бы использовать EventToCommand Behavior.

Мне также интересно, имеет ли смысл NavigatingBack. Если у нас будет что-то подобное, мы можем просто создать событие навигации, подобное оболочке.

Я понимаю, что это немного бессвязно :-), но просто хотел ответить на какой-то вопрос и высказать некоторые идеи для обсуждения

Вы можете просто применить их к активной странице, и NavigationPage отреагирует. Прилагаемые свойства хороши тем, что их можно привязать, поэтому вы можете просто настроить их на странице и привязать к виртуальной машине.

<ContentPage NavigationPage.BackButtonCommand={Bindiing BackCommand}

@PureWeen, извините, забыл, что доступ к свойствам был возможен на страницах таким образом, и в любом случае имеет смысл делать это таким образом.

Будет ли NavigationPage.BackButtonCommand использовать кнопку возврата устройства или только программную кнопку возврата? Поскольку есть и другие способы вызова обратной навигации.

В настоящее время я думаю, что NavigationPage.BackButtonCommand уйдет, и у нас есть что-то более обобщенное. Просто нужно немного подумать.

Что-то, связанное с pop / push, может иметь смысл и соответствовать существующим API

Не совсем это, но что-то в этом роде

UserRequestedPoppingCommand
UserRequestedPushingCommand

Или, возможно, PoppingCommand и PushingCommand, и тогда у нас может быть что-то похожее на ваши аргументы, дающие контекст.

C# enum NavigationSourceType { Unspecified, HwButton, Navbar, Gesture, FromCode }

Я бы тоже хотел сделать все это связываемым, но я еще не совсем понял идею, которая мне очень нравится.

Возможно, что-то в навигации указывает на текущее состояние навигации?
Поэтому, если это делается с помощью команды, вы можете спросить у навигации, выполняется ли это жест или другой

Есть новости по этому поводу? Мы ждали этого больше года.

Есть новости по этому поводу? Мы ждали этого больше года.

Расслабиться. Год - ничто. Более 4 лет назад сообщалось, что SplitView с MasterDetail на iPad не работает и содержит ошибки. В то время Xamarin.Forms все еще использовал Bugzilla.

@SebastianKruseWago Это совершенно другой сценарий, нежели ожидаемая функциональность, которая уже существует в другой области. Они также исправили «ошибку», которая позволила обойти ее. Так что год - это много для того, что нужно было включить с первого дня.

@ akemper1 SplitView также должен работать с первого дня. Это также ошибка, потому что это проблема только с iPad MasterDetailRenderer. Это работало до 2.4 или около того с уродливым обходным решением. Так что я не думаю, что это по-другому.

Здравствуйте, есть новости?

@scriptBoris Возможные обходные пути описаны в этих ссылках, одно решение может подойти лучше, чем другое, в зависимости от структуры вашего проекта.

https://forums.xamarin.com/discussion/67854/android-menu-and-back-button-not-working

https://theconfuzedsourcecode.wordpress.com/2017/03/12/lets-override-navigation-bar-back-button-click-in-xamarin-forms/

Я получил оба решения по ссылкам в отдельных проектах.

Добрый день, прошу прощения за беспокойство, но есть ли новости по решению этой проблемы? О.О

Обновляю вопрос :)

<ContentPage NavigationPage.HasBackButton="False">

Есть какие-нибудь обновления по этому поводу? Решения, представленные в этой ветке, более чем приемлемы, прошли годы, и люди этого ждут.

Может ли кто-нибудь из команды Xamarin прокомментировать статус этого? Это действительно большая проблема для многих.

Я знаю, что вы можете сделать это в оболочке, но для многих более крупных приложений, использующих преимущества Prism или MVVMCross, оболочка не полностью поддерживается, так что это то, что нам действительно нужно.

Спасибо

Приносим извинения

Мы не забыли об этом, но только немного задержались с официальным API, чтобы остановиться. Есть несколько ожидающих PR Shell, которые влияют на кнопку "Назад", которые будут распространяться на используемые здесь API.

Я согласен со многими, которые говорят, что это большая проблема для них.

Я собираюсь попробовать некоторые обходные пути. Я просто хочу иметь возможность запретить пользователю возвращаться, пока он не «подтвердит», что он потеряет изменения на странице, на которой он находится.

есть новости об этом? это было очень давно :(

Была ли эта страница полезной?
0 / 5 - 0 рейтинги