Xamarin.forms: لا يمكن اعتراض زر رجوع البرنامج

تم إنشاؤها على ٢٢ فبراير ٢٠١٨  ·  53تعليقات  ·  مصدر: xamarin/Xamarin.Forms

وصف

لا يستخدم زر رجوع البرنامج نفس مسارات التعليمات البرمجية مثل زر رجوع الجهاز. يؤدي هذا إلى سلوك غير متوقع على Android (وما قرأته ، iOS).

خطوات التكاثر

  1. تجاوز أسلوب "OnBackButtonPressed ()" على MasterDetailPage.
  2. قم بتشغيل التطبيق على Android وانتقل إلى صفحة التفاصيل في MasterDetailPage.
  3. اضغط على السهم "رجوع" في شريط الأوامر.

سلوك متوقع

يجب استدعاء أسلوب "OnBackButtonPressed ()" ، كما هو الحال عند الضغط على زر "رجوع" للجهاز.

السلوك الفعلي

لم يتم استدعاء الطريقة.

معلومات اساسية

  • الإصدار مع المشكلة:
  • آخر إصدار جيد معروف: غير معروف
  • IDE: Visual Studio 2017
  • الأطر المستهدفة للمنصة:

    • أندرويد: 8.0 أوريو

    • UWP: UWP 16299 (يعمل بشكل جيد!)

  • إصدار مكتبة دعم Android: v7 / v4
  • حزم نوجيت:

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 يجب أن يتعامل مع كل من الأزرار الخلفية الصلبة والبرامج. ومع ذلك ، ليس من الصعب أن نفهم كلاهما. لقد قمت بالتدوين على هذا الموضوع هنا: https://msicc.net/xamarin-forms-the-mvvmlight-toolkit-and-i-taking-control-over-the-back-buttons/

MSiccDev إذا واصلنا العمل على حل المشكلات التي يطرحها إطار العمل ، فلن يتم إصلاحها أبدًا وسيتعين على الأشخاص الاستمرار في فعل ذلك بأنفسهم مرارًا وتكرارًا حتى موت التقنية.

AceCoderLaura صحيح على جانب واحد. على الجانب الآخر ، على المرء أن يتحرك إلى الأمام. أفضل شيء هو حل المشكلة ولكن الإبلاغ عن المشكلة.

تعمل هذه الحلول على كسر قائمة الهامبرغر في صفحة الجذر ...
-.-

AceCoderLaura أستخدمه في أحد تطبيقاتي مع صفحة MD دون أي مشاكل ...

تضمين التغريدة
هذا هو الحل البديل الخاص بي:

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)

هل هناك أي تقدم لهذه القضية؟ لدي العديد من طرق عرض التنقل المتداخلة وسيكون من الصعب جدًا تصحيح هذا في تطبيقي. أوافق مع AceCoderLaura على أنه يجب تصحيح هذا بواسطة xamarin.

نفس المشكلة. أعتقد أنه من الشائع جدًا معالجة الحدث الخلفي في تطبيق المؤسسة. يجب أن يتم إصلاحه في أسرع وقت ممكن.

الرجاء إصلاح هذا ، فقد تم الإبلاغ عنه منذ ما يقرب من عام ، ومن السخف عدم الحصول عليه بعد.

ddobrev أنت محق ، فهذه ميزة مفيدة للغاية ، ولكن للأسف لم يتم تحديد كيفية عملها بوضوح. ذكره أحدهم ولم يرد عليه:

نعم ، هذا بالضبط هو مشكلتنا. يجب إضافة رد الاتصال السابق ذكره إلى قاعدة الكود أو يجب تحسين الطريقة الحالية لتضمين الأحداث من زر رجوع البرنامج.

لو كان هذا محددًا بوضوح ، كنت سأحاول إنشاء علاقات عامة لتنفيذه.

لا أعرف السبب ، ولكن في حالتي (على Android) كان ذلك كافياً لإضافة هذا إلى نشاطي الرئيسي

        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

حسنًا ، في كلتا الحالتين على ما يرام. افعل ذلك. لقد مر وقت طويل بما فيه الكفاية.

كميزة الصفحة هل سيكون شيء من هذا القبيل منطقيًا؟ سيكون من المفيد للغاية إذا تمكنا من مراقبة وإلغاء التنقل العكسي (ومن هنا جاءت المهمة \

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

يبدو أن حل

بالإضافة إلى ذلك ، أعتقد أنه سيكون من الرائع توسيع هذا بشكل أكبر وتقديم شيء يشبه "حالة الصفحة".

يمكن أن تكون الصفحة نشطة أو غير نشطة.

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 لقد ألقيت نظرة سريعة على المشكلة المرتبطة وبما أنني لم أستخدم shell بعد ، فهذا سؤال أكثر. 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(); }

شيء من هذا القبيل يجب أن يعمل معي لكنه يبدو مرهقًا. ربما لا أنظر إلى الاقتراح بشكل صحيح. من المفيد رؤية حالات الاستخدام موضحة بالأمثلة.

ملاحظة مثل nschoenberg ، لدي أيضًا اعتراض مع عمليات عرض مخصصة في تطبيقاتي (على NavigationPage ، أفعل شيئًا مثل طريقة MyProcessBackButton أعلاه. من الجيد أن الاقتراح لا يتطلب Shell - سيسمح باعتماد أسهل لتطبيقاتنا القديمة).

  • إذا لم يتم تعيين {Shell، NaviationPage} .BackButtonCommand ، يتصرف زر الرجوع بشكل طبيعي ويحدث التنقل الخلفي تلقائيًا.

هذه هي الطريقة التي أتخيلها تعمل بها ، وغالبًا ما نريد الوظيفة الافتراضية إذا لم يتم تجاوزها. هذا من شأنه أن يتصرف مثل تجاوز زر رجوع الجهاز على نظام أندرويد والعودة إلى الوضع الصحيح. ألا يعقل تكرار هذا التنفيذ بطريقة ما؟

كميزة الصفحة هل سيكون شيء من هذا القبيل منطقيًا؟ سيكون من المفيد للغاية إذا تمكنا من مراقبة وإلغاء التنقل العكسي (ومن هنا جاءت المهمة). أيضًا ، قد يكون من المفيد أن تكون قادرًا على التمييز بين سبب عودة الطلب.

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. الخصائص المرفقة رائعة لأنها قابلة للربط ، لذا يمكنك فقط إعدادها على صفحة وربطها بـ VM.

<ContentPage NavigationPage.BackButtonCommand={Bindiing BackCommand}

إحدى مزايا وجود الأمر فقط "تعطيل" السلوك الافتراضي هو أنه يتيح التنقل غير المتزامن. لأنه الآن يقوم الزر فقط بالتوجيه إلى الأمر ويمكن للأمر القيام بأي شيء طالما شاء ومن ثم يمكنه استخدام واجهات التنقل لإكمال التنقل إذا أراد ذلك.

يعد جعل كل شيء غير متزامن أمرًا مثيرًا للاهتمام بشكل أساسي بسبب سيناريوهات مثل التمرير سريعًا للخلف أو التمرير سريعًا للتجاهل بسبب عدم تزامنها في الأصل ، لذا ما يمكننا فعله هنا هو النقر على تلك الإيماءات والتوجيه إلى الأمر وإلغاء إيماءة.

يمكننا أيضًا أن نجعله حدثًا في فئة التنقل والذي يمكن أن يؤدي إلى إطلاق الخادم الوكيل الهرمي بالكامل ومن ثم باستخدام حدث ما ، يمكنك استخدام EventToCommand Behavior.

أتساءل أيضًا عما إذا كان NavigatingBack منطقيًا. إذا كان لدينا شيء من هذا القبيل ، فقد نقوم أيضًا بإنشاء حدث ملاحي مشابه لـ shell.

أدرك أن هذا أمر شائك بعض الشيء :-) لكنني أردت فقط الإجابة على بعض الأسئلة والحصول على بعض الأفكار للمناقشة

يمكنك فقط تطبيقها على الصفحة النشطة ويتفاعل NavigationPage. الخصائص المرفقة رائعة لأنها قابلة للربط ، لذا يمكنك فقط إعدادها على صفحة وربطها بـ VM.

<ContentPage NavigationPage.BackButtonCommand={Bindiing BackCommand}

@ PureWeen آسف نسيت أن الوصول إلى الخصائص كان ممكنًا على الصفحات بهذه الطريقة ومن المنطقي القيام بذلك بهذه الطريقة على أي حال.

هل سيستهلك NavigationPage.BackButtonCommand زر رجوع الجهاز أيضًا أم مجرد زر رجوع البرنامج؟ نظرًا لوجود طرق أخرى لاستدعاء التنقل الخلفي.

أفكر حاليًا في NavigationPage.ButtonCommand يختفي ولدينا شيء أكثر عمومية. فقط بحاجة إلى إعطائها مزيدًا من التفكير.

قد يكون هناك شيء مرتبط بالبوب ​​/ الدفع منطقيًا ويتوافق مع واجهات برمجة التطبيقات الحالية

ليست هذه بالضبط ولكن شيء من هذا القبيل

UserRequestedPoppingCommand
UserRequestedPushingCommand

أو ربما PoppingCommand و PushingCommand ومن ثم يمكننا الحصول على شيء مشابه لحججك التي تعطي السياق.

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

أود أن أجعل كل ذلك قابلاً للربط أيضًا ، لكنني لم أنقر بعد على فكرة أحبها كثيرًا.

ربما هناك شيء ما في التنقل يشير إلى الحالة الحالية للملاحة؟
لذلك إذا تم ذلك عن طريق الأمر ، فيمكنك أن تسأل التنقل عما إذا كانت إيماءة قيد التقدم أم غير ذلك

أي تحديث على هذا؟ لقد كنا ننتظر هذا منذ أكثر من عام.

أي تحديث على هذا؟ لقد كنا ننتظر هذا منذ أكثر من عام.

الاسترخاء. عام لا شيء. تم الإبلاغ عن SplitView مع MasterDetail على iPad منذ أكثر من 4 سنوات أنه لا يعمل وأنه تم التنصت عليه. في هذا الوقت ، كانت Xamarin.Forms لا تزال تستخدم Bugzilla.

SebastianKruseWago هذا سيناريو مختلف تمامًا عن الوظيفة المتوقعة الموجودة بالفعل في منطقة مختلفة. قاموا أيضًا بإصلاح "الخلل" الذي سمح بالتغلب على المشكلة. إذن فالعام كثير ، لشيء كان يجب أن يُدرج منذ اليوم الأول.

@ akemper1 يجب أن يعمل SplitView أيضًا من اليوم الأول. إنه أيضًا خطأ لأنه مجرد مشكلة في iPad MasterDetailRenderer. لقد عملت قبل 2.4 أو نحو ذلك مع حل بديل قبيح. لذلك لا أعتقد أن الأمر مختلف.

مرحبا هل من اخبار

مساء الخير أعتذر عن إزعاجك ولكن هل هناك أخبار لحل هذه المشكلة؟ О.О

أقوم بتحديث السؤال :)

<ContentPage NavigationPage.HasBackButton="False">

هل هناك أي تحديث على ذلك؟ الحلول المقدمة في هذا الموضوع أكثر من مقبولة ، لقد مرت سنوات والناس ينتظرون ذلك.

هل يمكن لأي شخص من فريق Xamarin التعليق على حالة هذا؟ هذه حقا مشكلة كبيرة لكثير من الناس.

أعلم أنه يمكنك القيام بذلك في shell ، ولكن بالنسبة للعديد من التطبيقات الكبيرة التي تستفيد من Prism أو MVVMCross ، فإن shell غير مدعوم بالكامل ، لذلك هذا شيء نحتاجه حقًا.

شكرا

اعتذارات @ akemper1 لكن لا توجد تحديثات محددة حاليًا.

لم ننس هذا الأمر ولكن تأخرنا قليلاً في واجهة برمجة التطبيقات الرسمية للاستقرار. هناك بعض العلاقات العامة لـ Shell المعلقة التي تؤثر على زر الرجوع الذي سينتشر إلى واجهات برمجة التطبيقات المستخدمة هنا

أتفق مع الكثيرين الذين يقولون إن هذه مشكلة كبيرة بالنسبة لهم.

سأقوم بتجربة بعض الحلول البديلة. أريد فقط أن أكون قادرًا على منع المستخدم من العودة إلى أن "يؤكد" أنه سيفقد التغييرات على الصفحة التي يتواجد فيها.

أي خبر عن هذا؟ لقد مر وقت طويل حقًا :(

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات