Xamarin.Forms 的頁面事件
- OnAppearing()您可以在頁面內的 code-behind 重新覆寫這個事件,當 Xamarin.Forms 頁面變成可見的時候,這個事件將會被呼叫。
- OnDisappearing()您可以在頁面內的 code-behind 重新覆寫這個事件,當 Xamarin.Forms 頁面變成不可見的時候,這個事件將會被呼叫。
因此,透過一個簡單的範例專案,在這個專案內,將會有兩個頁面,一個是
主頁面
,另一個是 Page1頁面
;這兩個頁面都有一個按鈕,前者頁面的按鈕按下之後,會切換到 Page1頁面
頁面,而後者頁面的按鈕按下之後,將會回到 主頁面
;實際執行畫面如下圖所示。
ALM無導航
下面螢幕截圖,是在 iOS 系統內的執行情況
而每個頁面的 code-behind 中,將會有底下的程式碼;您將會看到,當要顯示這個頁面的時候,將會寫入訊息到除錯視窗內,而當不要再顯示這個頁面的時候,也會寫入訊息到除錯視窗內。
protected override void OnAppearing()
{
Debug.WriteLine($"{this.Title} 進入到 OnAppearing");
base.OnAppearing();
}
protected override void OnDisappearing()
{
Debug.WriteLine($"{this.Title} 進入到 OnDisappearing");
base.OnDisappearing();
}
不過,若您使用了 Prism 設計模式工具來開發 Xamarin.Forms 應用程式,除了在每個頁面的 code-behind 會有上述覆寫程式碼,在每個頁面相對應的檢視模型(ViewModel)內,也會實作
INavigationAware
ˋ頁面的兩個方法:- OnNavigatedFrom當進行頁面導航時候,需要離開這個頁面 (navigated away from),此時,這個方法將會被呼叫
- OnNavigatedTo當進行頁面導航時候,需要進入這個頁面 (navigated to),此時,這個方法將會被呼叫
因此,使用 Prism 設計模式工具開發的專案,當在進行頁面導航的時候,每個頁面將會有兩個事件會被呼叫到:
Page1 導航到 Page2
Page1 內的
OnDisappearing
& OnNavigatedFrom
將會被呼叫
Page2 內的
OnAppearing
& OnNavigatedTo
將會被呼叫
另外有一點特別要提到的是,當您採用了 Prism 設計模式工具,若您的進入點頁面是
ContentPage
,則,一樣可以透過 Prism 來進行導航,如下圖所示。
所以,在 Prism 設計模式的專案內,將會進行兩個模式的測試:
- 進入點的頁面採用 ContentPage (請修改核心PCL 內的 App.xaml.cs 檔案內的 OnInitialized 方法)
NavigationService.NavigateAsync("MainPage?title=Hello%20from%20Xamarin.Forms");
- 進入點的頁面採用 NavigationPage (請修改核心PCL 內的 App.xaml.cs 檔案內的 OnInitialized 方法)
NavigationService.NavigateAsync("MainNavigationPage/MainPage?title=Hello%20from%20Xamarin.Forms");
這兩個測試頁面事件的範例專案,可以底下網址取得
- XFALM
- XFPrismALM (有使用 Prism)
實際執行結果
Xamarin.Forms 作法
底下是使用
XFALM
專案在 Android / iOS 模擬器上跑的結果Android | iOS |
---|---|
[0:] 主頁面 進入到 OnAppearing | [0:] 主頁面 進入到 OnAppearing |
[0:] 主頁面 進入到 OnDisappearing | [0:] 主頁面 進入到 OnDisappearing |
[0:] Page1頁面 進入到 OnAppearing | [0:] Page1頁面 進入到 OnAppearing |
[0:] Page1頁面 進入到 OnDisappearing | [0:] Page1頁面 進入到 OnDisappearing |
[0:] 主頁面 進入到 OnAppearing | [0:] 主頁面 進入到 OnAppearing |
Prism 作法 - 使用 ContentPage
底下是使用
XFPrismALM
專案在 Android / iOS 模擬器上跑的結果Android | iOS |
---|---|
[0:] 主頁面 進入到 OnNavigatedTo | [0:] 主頁面 進入到 OnNavigatedTo |
[0:] 主頁面 進入到 OnAppearing | [0:] 主頁面 進入到 OnAppearing |
[0:] 主頁面 進入到 OnNavigatedFrom | [0:] 主頁面 進入到 OnNavigatedFrom |
[0:] 主頁面 進入到 OnDisappearing | [0:] Page1頁面 進入到 OnAppearing |
[0:] Page1頁面 進入到 OnAppearing | [0:] 主頁面 進入到 OnDisappearing |
[0:] Page1頁面 進入到 OnNavigatedTo | [0:] Page1頁面 進入到 OnNavigatedTo |
[0:] Page1頁面 進入到 OnNavigatedFrom | [0:] Page1頁面 進入到 OnNavigatedFrom |
[0:] Page1頁面 進入到 OnDisappearing | [0:] 主頁面 進入到 OnAppearing |
[0:] 主頁面 進入到 OnNavigatedTo | [0:] Page1頁面 進入到 OnDisappearing |
[0:] 主頁面 進入到 OnAppearing | [0:] 主頁面 進入到 OnNavigatedTo |
Prism 作法 - 使用 NavigationPage
Android | iOS |
---|---|
[0:] 主頁面 進入到 OnNavigatedTo | [0:] 主頁面 進入到 OnNavigatedTo |
[0:] 主頁面 進入到 OnAppearing | [0:] 主頁面 進入到 OnAppearing |
[0:] 主頁面 進入到 OnNavigatedFrom | [0:] 主頁面 進入到 OnNavigatedFrom |
[0:] 主頁面 進入到 OnDisappearing | [0:] 主頁面 進入到 OnDisappearing |
[0:] Page1頁面 進入到 OnAppearing | [0:] Page1頁面 進入到 OnAppearing |
[0:] Page1頁面 進入到 OnNavigatedTo | [0:] Page1頁面 進入到 OnNavigatedTo |
[0:] Page1頁面 進入到 OnNavigatedFrom | [0:] Page1頁面 進入到 OnNavigatedFrom |
[0:] Page1頁面 進入到 OnDisappearing | [0:] Page1頁面 進入到 OnDisappearing |
[0:] 主頁面 進入到 OnAppearing | [0:] 主頁面 進入到 OnAppearing |
[0:] 主頁面 進入到 OnNavigatedTo | [0:] 主頁面 進入到 OnNavigatedTo |
在這份筆記中,將要來測試與分析頁面事件的呼叫順序;在 Xamarin.Forms 應用程式中,只要繼承了
Page
類別的頁面,都會擁有這兩個事件可以使用: