Xamarin.forms: Tidak Dapat Mencegat Tombol Kembali Perangkat Lunak

Dibuat pada 22 Feb 2018  ·  53Komentar  ·  Sumber: xamarin/Xamarin.Forms

Keterangan

Tombol kembali perangkat lunak tidak menggunakan jalur kode yang sama dengan tombol kembali perangkat keras. Ini mengarah ke perilaku tak terduga di Android (dan dari apa yang saya baca, iOS).

Langkah-langkah untuk Reproduksi

  1. Ganti metode "OnBackButtonPressed()" di MasterDetailPage.
  2. Jalankan aplikasi di Android dan arahkan ke halaman detail di MasterDetailPage.
  3. Tekan panah "Kembali" pada bilah perintah.

Perilaku yang Diharapkan

Metode "OnBackButtonPressed()" harus dipanggil, sama seperti saat tombol "kembali" perangkat keras ditekan.

Perilaku Sebenarnya

Metode ini tidak dipanggil.

Informasi dasar

  • Versi dengan masalah:
  • Versi bagus yang terakhir diketahui: Tidak diketahui
  • IDE: Visual Studio 2017
  • Kerangka Target Platform:

    • Android: 8.0 Oreo

    • UWP: UWP 16299 (Berfungsi dengan baik!)

  • Versi Pustaka Dukungan Android: v7/v4
  • Paket 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} Beradaptasi.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} Beradaptasi.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} Beradaptasi.Bisnis.Standar
Microsoft.CSharp {4.4.1} Beradaptasi.Bisnis.Standar
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

  • Perangkat yang Terkena Dampak: HTC U11

Tautan Reproduksi

Akan memberikan jika diminta.

backbutton high impact proposal-open enhancement ➕

Komentar yang paling membantu

Adakah cara untuk meningkatkan prioritas?
Saya telah memiliki solusi selama bertahun-tahun sekarang, yang terkadang tidak berfungsi lagi, ...
Solusi saya saat ini juga merupakan peretasan yang sangat buruk dengan kerugian, ingin menghapus perender halaman navigasi khusus saya untuk selamanya dan memperbaiki beberapa masalah dalam prosesnya.

Semua 53 komentar

@samhouts Ya, itulah masalah kami. Panggilan balik yang disebutkan di atas perlu ditambahkan ke basis kode atau metode yang ada perlu ditingkatkan untuk menyertakan peristiwa dari tombol kembali perangkat lunak.

@samhouts apakah bug ini sudah diterima? Ini masalah besar. Informasi apa lagi yang dibutuhkan?

Saya setuju bahwa OnBackButtonPressed harus menangani Hard- dan Software-BackButtonss. Meskipun demikian, tidak sulit untuk mencegat keduanya. Saya membuat blog tentang topik itu di sini: https://msicc.net/xamarin-forms-the-mvvmlight-toolkit-and-i-taking-control-over-the-back-buttons/

@MSiccDev Jika kita terus mengatasi masalah yang disajikan oleh kerangka kerja, maka itu tidak akan pernah diperbaiki dan orang harus terus melakukan ini sendiri berulang-ulang sampai matinya teknologi.

@AceCoderLaura benar di satu sisi. Di sisi lain, seseorang harus bergerak maju. Hal terbaik adalah mengatasinya tetapi laporkan masalahnya.

Solusi ini memecahkan menu hamburger di halaman root...
-.-

@AceCoderLaura Saya menggunakannya di salah satu aplikasi saya dengan MD-Page tanpa masalah...

@MSiccDev
Inilah solusi peretasan saya:

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 Apakah

Apakah ada kemajuan untuk masalah ini? Saya memiliki beberapa tampilan navigasi bersarang dan akan sangat sulit untuk menambal ini di aplikasi saya. Saya setuju dengan

Permasalahan yang sama. Saya pikir itu cukup umum untuk menangani kembali acara di aplikasi perusahaan. Itu harus diperbaiki secepatnya.

Tolong perbaiki ini, sudah dilaporkan hampir satu tahun, dan konyol belum memilikinya.

@ddobrev Anda benar ini adalah fitur yang sangat berguna, tetapi sayangnya fitur ini bahkan belum didefinisikan dengan jelas bagaimana cara kerjanya. Seseorang disebutkan di atas tetapi tidak mendapat tanggapan:

Ya itu cukup banyak persis masalah kami. Panggilan balik yang disebutkan di atas perlu ditambahkan ke basis kode atau metode yang ada perlu ditingkatkan untuk menyertakan peristiwa dari tombol kembali perangkat lunak.

Seandainya ini didefinisikan dengan jelas, saya akan mencoba membuat PR untuk mengimplementasikannya.

Saya tidak tahu mengapa, tetapi dalam kasus saya (di Android) sudah cukup untuk menambahkan ini ke MainActivity saya

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

            base.OnPostCreate(savedInstanceState);
        }

Dengan ini OnBackButtonPressed diaktifkan baik bahkan jika saya menekan tombol kembali perangkat keras dan tombol kembali perangkat lunak pada bilah navigasi. Tapi saya tidak mengerti mengapa.

Di iOS saya masih harus menambahkannya sendiri dengan perender Halaman khusus.

Jadi, apakah ini akan diperbaiki di 3.6.0?

Saya pikir itu dipindahkan ke In Progress karena kesalahan.

@samhouts jadi perlu spesifikasi sekarang? Apa yang tidak ditentukan tentang itu?

@ddobrev kita masih perlu menentukan cara terbaik untuk mengungkapkan apa yang diinginkan orang. Saat ini OnBackButtonPressed lebih khusus memetakan ke tombol kembali Hardware sehingga fitur-fiturnya lebih berputar di sekitar itu. Banyak yang diinginkan orang lebih merupakan fitur OnNavigatingBack.

Hanya mengikat panah kembali perangkat lunak ke metode itu sekarang masih tampak lebih seperti peretasan daripada memberikan solusi terbaik

Misalnya hanya mencela OnBackButtonPressed dan membuat

OnHardwareBackButtonPressed dan OnNavigatingBack

Yah, kedua cara itu baik-baik saja. Lakukan saja. Sudah cukup lama.

Sebagai fitur Halaman, apakah hal seperti ini masuk akal? Akan sangat membantu jika kami dapat mengamati dan membatalkan navigasi terbalik (karenanya Tugas\

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);
    }
}

Opsi layak kedua yang dapat saya lihat adalah mengimplementasikan ini sebagai bagian dari antarmuka INavigation .

EDIT: sedikit memodifikasi API

Solusi @pikausp terlihat seperti yang terbaik bagi saya

Selain itu, saya pikir akan sangat bagus untuk memperluas ini lebih jauh dan memperkenalkan sesuatu yang menyerupai "Status halaman".

Halaman bisa aktif atau tidak aktif.

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);
    }
}

Ketika Halaman dinavigasi menjauh dari OnDeactivating dipanggil. Nilai IsPermanent didasarkan pada apakah halaman disimpan di tumpukan navigasi atau tidak (true untuk pops, false untuk push).

Mungkin memperkenalkan OnActivated dan OnDeactivated yang dipanggil setelah navigasi selesai.

Ini memberi pengembang aliran navigasi kekuatan besar.

Apa yang Anda pikirkan?

Maukah Anda melaporkan kemajuan apa pun di sini?

Adakah cara untuk meningkatkan prioritas?
Saya telah memiliki solusi selama bertahun-tahun sekarang, yang terkadang tidak berfungsi lagi, ...
Solusi saya saat ini juga merupakan peretasan yang sangat buruk dengan kerugian, ingin menghapus perender halaman navigasi khusus saya untuk selamanya dan memperbaiki beberapa masalah dalam prosesnya.

Menabrak

Pembaruan apa pun untuk mencegat tombol kembali lunak. Kami benar-benar berjuang dalam hal ini. Tidak ada solusi yang disebutkan dalam posting ini yang berfungsi untuk kami.

Ini benar-benar dibutuhkan. Harus meretas atau mengimplementasikan bilah alat Anda sendiri sedikit berlebihan untuk kelalaian yang begitu jelas. Tolong ...

Adakah pembaruan di sini
Kedengarannya seperti beberapa solusi tingkat tinggi telah disarankan di sini, yang semuanya akan memberi kita fungsionalitas yang kita cari.

Juga ingin memiliki fitur ini.

Diperlukan untuk setiap kasus penggunaan yang harus mencegah kehilangan data. Saya membutuhkan ini juga, setiap solusi terlalu rumit.

Oke, tim, kami sekarang condong ke fungsi yang dijelaskan di sini: https://github.com/xamarin/Xamarin.Forms/issues/6971#issuecomment -574823028

Ada keberatan?

@samhouts Saya melihat sekilas masalah yang ditautkan dan karena saya belum pernah menggunakan Shell, ini lebih merupakan pertanyaan. BackButtonBehavior hanyalah pembungkus (dengan beberapa tambahan) di sekitar perintah yang dieksekusi ketika pengguna mencoba menavigasi kembali?

Pada dasarnya, ini bukan tentang mencegat navigasi terbalik tetapi mengambil kendali atas apa yang sebenarnya terjadi ketika pengguna mencoba menavigasi kembali melalui metode apa pun yang tersedia (geser, tombol navbar, tombol android,..). Saya dapat memutuskan untuk menavigasi pengguna ke halaman baru alih-alih menavigasi kembali jika saya memutuskan demikian, apakah itu benar?

@samhouts Saya memiliki intersepsi yang berfungsi di aplikasi produksi saya untuk iOS uwp dan Android. iOS dan Android menggunakan perender Halaman khusus. Ketika Pengguna menavigasi kembali melalui Tombol Kembali Perangkat Lunak atau Perangkat Keras, saya dapat Menampilkan Pop-up "Buang Perubahan?". Saat Pengguna mengonfirmasi prompt, Navigasi kembali dijalankan dan Halaman muncul, selain itu Pengguna tetap berada di Halaman saat ini. Saya belum mempertimbangkan bahwa menggesek juga memungkinkan untuk Kembali, itu Hilang dalam Implementasi saya

@samhouts - Tidak jelas bagi saya bagaimana proposal memungkinkan intersepsi tombol kembali untuk menambahkan langkah bersyarat.

Apakah proposal bekerja seperti ini?

  • jika {Shell, NaviationPage}.BackButtonCommand tidak ditetapkan, tombol kembali berfungsi secara normal dan navigasi kembali terjadi secara otomatis.
  • Jika {Shell, NaviationPage}.BackButtonCommand ditetapkan, maka tidak ada navigasi mundur yang terjadi secara otomatis. Instance ICommand yang ditetapkan dapat secara eksplisit melakukan sesuatu seperti ini, tergantung pada apakah Anda menggunakan Shell atau tidak.

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(); }

Sesuatu seperti itu seharusnya bekerja untuk saya tetapi tampaknya tidak praktis. Mungkin saya tidak melihat proposal dengan benar. Ini akan membantu untuk melihat kasus penggunaan dieja dengan contoh.

PS Seperti @nschoenberg , saya juga memiliki intersepsi dengan render khusus di aplikasi saya (di NavigationPage, melakukan sesuatu seperti metode MyProcessBackButton di atas. Sangat menyenangkan bahwa proposal tidak memerlukan Shell - ini akan memungkinkan adopsi yang lebih mudah untuk aplikasi lama kami).

  • jika {Shell, NaviationPage}.BackButtonCommand tidak ditetapkan, tombol kembali berfungsi secara normal dan navigasi kembali terjadi secara otomatis.

Ini adalah bagaimana saya membayangkannya bekerja, seringkali kita menginginkan fungsionalitas default jika tidak diganti. Ini akan berperilaku sama dengan mengganti tombol kembali perangkat di Android dan mengembalikan true. Bukankah masuk akal untuk meniru implementasi itu?

Sebagai fitur Halaman, apakah hal seperti ini masuk akal? Akan sangat membantu jika kami dapat mengamati dan membatalkan navigasi terbalik (karenanya Tugas). Selain itu, mungkin berguna untuk dapat membedakan apa yang menyebabkan permintaan bernavigasi kembali.

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);
    }
}

Opsi layak kedua yang dapat saya lihat adalah mengimplementasikan ini sebagai bagian dari antarmuka INavigation .

EDIT: sedikit memodifikasi API

Dalam masalah https://github.com/xamarin/Xamarin.Forms/issues/6971#issuecomment -574823028 , saya tidak yakin persis di mana BackButtonCommand akan diekspos, hanya disediakan di NavigationPage? Apakah ada satu implementasi pada NavigationPage yang berisi dan semua halaman yang didorong ke tumpukan navigasi itu menggunakan perilaku yang sama? (Saya tidak merasa ini akan menjadi kasus penggunaan yang khas). Bagaimana masing-masing halaman menerapkan penggantiannya sendiri dan memanfaatkan perintah?

Saya pikir proposal yang diberikan di atas akan memenuhi kebutuhan pengembang untuk menimpa per halaman, karena permintaan navigasi belakang adalah beberapa yang tidak relevan sering kali pengembang ingin hanya mengontrol apa yang terjadi di navigasi belakang yaitu meminta beberapa dialog pengguna sebelum mengirim mereka ke halaman lain atau biarkan sebagai default.

Saya tidak dapat berbicara untuk semua orang tetapi kami memiliki contoh dalam proyek di mana kami menerapkan beberapa fungsi yang dieksekusi jika tombol perangkat lunak ditekan, kami juga menimpa OnBackButtonPressed yang memanggil fungsi yang sama. Dua bentuk navigasi belakang mengeksekusi kode yang sama.

Semua properti ini berfungsi sama seperti properti terlampir di NavigationPage

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

Anda bisa menerapkannya ke halaman aktif dan NavigationPage bereaksi. Properti terlampir bagus karena dapat diikat sehingga Anda bisa mengaturnya di halaman dan mengikatnya ke VM.

<ContentPage NavigationPage.BackButtonCommand={Bindiing BackCommand}

Salah satu keuntungan memiliki perintah hanya "menonaktifkan" perilaku default adalah memungkinkan navigasi async. Karena sekarang tombol hanya mengarahkan ke perintah dan perintah dapat melakukan apa saja selama yang diinginkan dan kemudian dapat menggunakan apis navigasi untuk menyelesaikan navigasi jika diinginkan.

Membuat semuanya async menarik terutama karena skenario seperti menggesek ke belakang atau menggesek untuk mengabaikan modal karena itu bukan "async" asli jadi yang juga bisa kita lakukan di sini adalah memanfaatkan gerakan itu, mengarahkan ke perintah, dan membatalkan sikap.

Kami juga dapat menjadikannya sebuah acara di kelas Navigasi yang dapat menjalankan semua proxy hierarkis dan kemudian dengan sebuah acara Anda dapat menggunakan Perilaku EventToCommand.

Saya juga bertanya-tanya apakah NavigatingBack masuk akal. Jika kita akan memiliki sesuatu seperti itu, sebaiknya buat saja acara navigasi yang mirip dengan shell.

Saya menyadari ini agak bertele-tele :-) tetapi hanya ingin menjawab beberapa pertanyaan dan mendapatkan beberapa ide untuk diskusi

Anda bisa menerapkannya ke halaman aktif dan NavigationPage bereaksi. Properti terlampir bagus karena dapat diikat sehingga Anda bisa mengaturnya di halaman dan mengikatnya ke VM.

<ContentPage NavigationPage.BackButtonCommand={Bindiing BackCommand}

@PureWeen maaf lupa mengakses properti dimungkinkan pada halaman seperti itu & tetap masuk akal untuk melakukannya dengan cara itu.

Akankah NavigationPage.BackButtonCommand menggunakan tombol kembali perangkat juga atau hanya tombol kembali perangkat lunak? Karena ada cara lain untuk memanggil navigasi kembali.

Saat ini saya berpikir NavigationPage.BackButtonCommand hilang dan kami memiliki sesuatu yang lebih umum. Hanya perlu memberikannya sedikit lebih banyak pemikiran.

Sesuatu yang terkait dengan pop/push mungkin masuk akal dan cocok dengan api yang ada

Bukan ini persis tetapi sesuatu di sepanjang garis ini

Perintah Popping yang Diminta Pengguna
UserRequestedPushingCommand

Atau mungkin PoppingCommand dan PushingCommand dan kemudian kami dapat memiliki sesuatu yang mirip dengan argumen Anda yang memberikan konteks.

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

Saya ingin membuat semuanya dapat diikat juga, tetapi saya belum cukup mengklik ide yang sangat saya sukai.

Mungkin sesuatu di Navigasi yang menunjukkan keadaan navigasi saat ini?
Jadi jika dilakukan melalui perintah, Anda dapat bertanya kepada Navigasi apakah itu gerakan yang sedang berlangsung atau lainnya

Ada pembaruan tentang ini? Kami telah menunggu ini selama lebih dari setahun.

Ada pembaruan tentang ini? Kami telah menunggu ini selama lebih dari setahun.

Santai. Setahun bukan apa-apa. SplitView dengan MasterDetail di iPad dilaporkan lebih dari 4 tahun yang lalu bahwa itu tidak berfungsi dan disadap. Saat ini, Xamarin.Forms masih menggunakan Bugzilla.

@SebastianKruseWago Itu adalah skenario yang sama sekali berbeda dari fungsionalitas yang diharapkan yang sudah ada di area yang berbeda. Mereka juga memperbaiki "bug" yang memungkinkan perbaikan. Jadi satu tahun adalah banyak, untuk sesuatu yang harus dimasukkan sejak hari pertama.

@akemper1 SplitView juga harus berfungsi sejak hari pertama. Ini juga merupakan bug karena hanya Masalah dengan iPad MasterDetailRenderer. Ini telah bekerja sebelum 2.4 atau lebih dengan solusi yang buruk. Jadi menurut saya tidak berbeda.

Halo, apakah ada berita?

Selamat siang, saya minta maaf karena mengganggu Anda, tetapi apakah ada berita untuk menyelesaikan masalah ini? .О

Saya memperbarui pertanyaan :)

<ContentPage NavigationPage.HasBackButton="False">

Apakah ada pembaruan tentang ini? Solusi yang disajikan di utas ini lebih dari dapat diterima, sudah bertahun-tahun dan orang-orang menunggu ini.

Adakah yang bisa dari tim Xamarin mengomentari status ini? Ini benar-benar masalah besar bagi banyak orang.

Saya tahu Anda dapat melakukan ini di shell, tetapi untuk banyak aplikasi besar yang memanfaatkan Prism atau MVVMCross shell tidak sepenuhnya didukung jadi ini adalah sesuatu yang sangat kami butuhkan.

Terima kasih

Maaf @akemper1 tetapi tidak ada pembaruan khusus saat ini.

Kami belum melupakan yang satu ini tetapi hanya sedikit tertunda pada API resmi untuk diselesaikan. Ada beberapa PR Shell tertunda yang memengaruhi Tombol Kembali yang akan disebarkan ke API yang digunakan di sini

Saya setuju dengan banyak orang yang mengatakan ini adalah masalah besar bagi mereka.

Saya akan mencoba beberapa solusi. Saya hanya ingin dapat mencegah pengguna kembali sampai mereka "mengkonfirmasi" bahwa mereka akan kehilangan perubahan pada halaman tempat mereka berada.

ada berita tentang ini? udah lama banget :(

Apakah halaman ini membantu?
0 / 5 - 0 peringkat