2017-04-05 68 views
2

更新:我已深入研究此問題,並發現這是一個Xamarin.Forms問題。C#/ Xamarin:出現/消失事件不會觸發

爲了證明這個問題,我從一個基本的PLC模板創建了以下簡單的Xamarin.Forms應用程序。

我添加了一個新頁面,其中包含簡單的處理程序,用於出現和消失事件。

using System; 
using System.Diagnostics; 
using Xamarin.Forms; 
using Xamarin.Forms.Xaml; 

namespace TestApp 
{ 
    [XamlCompilation(XamlCompilationOptions.Compile)] 
    public partial class EventPage : ContentPage 
    { 
     public EventPage() 
     { 
      InitializeComponent(); 
      Appearing += EventPage_OnAppearing; 
      Disappearing += EventPage_OnDisappearing; 
     } 

     private void EventPage_OnAppearing(object sender, EventArgs e) 
     { 
      Debug.WriteLine("Appeared"); 
     } 

     private void EventPage_OnDisappearing(object sender, EventArgs e) 
     { 
      Debug.WriteLine("Disappeared"); 
     } 
    } 
} 

然後我加了兩個按鈕,主網頁,其中導航上述網頁兩種不同的方式:

using System; 
using Xamarin.Forms; 

namespace TestApp 
{ 
    public partial class MainPage : ContentPage 
    { 
     public MainPage() 
     { 
      InitializeComponent(); 
     } 

     private void WorkingButton_OnClicked(object sender, EventArgs e) 
     { 
      Navigation.PushAsync(new EventPage()); 
     } 

     private void NonWorkingButton_OnClicked(object sender, EventArgs e) 
     { 
      Application.Current.MainPage = new EventPage(); 
     } 
    } 
} 

觀測和以前一樣,用PushAsync行爲是符合市場預期,但設置根頁面意味着事件不會觸發。

當我重置堆棧使用這條線 await _navigationService.NavigateAsync($"http://app.com/NavigationPage/HomePage/AlertPage");,所以這個問題似乎並沒有孤立到根頁面,這是在我的真實項目中出現的。

我在當前使用Xamarin Forms v2.3.4.192-pre2和Prism 6.3.0-pre2(Unity)並且在下面的測試應用程序中使用Xamarin Forms 2.3.3.193的項目中遇到過這個問題,棱鏡6.3.0(Dryloc)。我在LG G5上運行Android 7.0。

我不確定這是棱鏡問題還是Xamarin表單問題,因爲我不太確定如何將其重寫爲純粹的表單。

爲了證明這個問題,我做了下面的測試應用程序。

賽事頁面沒有從比EventPage.xaml.cs,在那裏我已經分配基本處理程序的出現和消失事件等基本棱鏡ContentPage模板更改:

using System; 
using System.Diagnostics; 
using Xamarin.Forms; 

namespace PrismErrorDemo.Views 
{ 
    public partial class EventPage : ContentPage 
    { 
     public EventPage() 
     { 
      InitializeComponent(); 
      Appearing += EventPage_OnAppearing; 
      Disappearing += EventPage_OnDisappearing; 
     } 

     private void EventPage_OnAppearing(object sender, EventArgs e) 
     { 
      Debug.WriteLine("Appeared"); 
     } 

     private void EventPage_OnDisappearing(object sender, EventArgs e) 
     { 
      Debug.WriteLine("Disappeared"); 
     } 
    } 
} 

我的MainPage有兩個簡單的按鈕,其導航到我的EventPage,一個相對和一個絕對。

using System; 
using Prism.Commands; 
using Prism.Mvvm; 
using Prism.Navigation; 

namespace PrismErrorDemo.ViewModels 
{ 
    public class MainPageViewModel : BindableBase 
    { 
     private readonly INavigationService _navigationService; 

     public DelegateCommand WorkingCommand { get; set; } 
     public DelegateCommand NonWorkingCommand { get; set; } 

     public MainPageViewModel(INavigationService navigationService) 
     { 
      _navigationService = navigationService; 

      WorkingCommand = new DelegateCommand(WorkingCommandAction); 

      NonWorkingCommand = new DelegateCommand(NonWorkingCommandAction); 
     } 

     private async void WorkingCommandAction() 
     { 
      await _navigationService.NavigateAsync("EventPage"); 
     } 

     private async void NonWorkingCommandAction() 
     { 
      await _navigationService.NavigateAsync("http://app.com/EventPage"); 
     } 
    } 
} 

當我使用await _navigationService.NavigateAsync("EventPage");導航時,事情的行爲與他們應該的完全相同。兩個事件處理程序在它們應該被調用時被調用。

但是,當我瀏覽使用await navigationService.NavigateAsync("http://app.com/EventPage");我拿到稱爲我瀏覽網頁的露面事件,並使用後退按鈕關閉該應用程序將導致消失的事件被調用。所有其他時間關閉並重新打開應用程序無法調用任一事件。

我在Github問題頁面上找不到任何這方面的參考,並且希望確保在發佈之前我不會漏掉任何明顯的東西。

+0

您是否嘗試過在這裏記錄的錯誤: https://開頭bugzilla.xamarin.com/describecomponents.cgi –

回答

0

我想你在創建OnAppearing方法時刪除了一些東西。

嘗試加base.OnAppearing();回到OnAppearing方法。

0

ContentPage類從層次結構中的某處派生一個虛擬OnAppearing()方法。嘗試覆蓋該功能。

+0

這不是一個真正的答案,而是一個評論。一旦你有足夠的聲譽,你將能夠評論帖子。 – mrun

1

使用以下重寫方法,而不是定製

OnAppearing()

protected override void OnAppearing() 
{ 
    base.OnAppearing(); 
} 

OnDisappearing()

protected override void OnDisappearing() 
{ 
    base.OnDisappearing(); 
}