在學習過程中,大致的總結一些頁面導航與參數傳遞的知識。
通常我們的應用程序是由多個應用頁面構成的,於是就有一個十分重要的行為——頁面間的切換。在這里成為頁面間的導航。我們需要注意的問題是:怎么實現切換和怎么傳遞參數。
我們要了解的信息是:
- 每個頁面都有一個獨立的URI;
- 每一個頁面都是無狀態的,也就是每次加載完頁面后,需要重新加載這個頁面中所必須的所有參數和數據;
- 每個頁面可以像Web一樣,通過鏈接地址的方式導航。
顯而易見,我們實現頁面切換的必要數據就是每一個頁面的URI,這和我們Web中的Uri的書寫是相仿的,我們一樣可以通過“?id=‘’”的形式來傳遞參數。
我們創建一個項目,叫做“NavigationPractice”,添加一個頁面叫做“MyPage.xaml”,這是主頁面MainPage需要導航到的頁面。
四種頁面切換的方式
使用HyperlinkButton來實現
這也是HyperlinkButton的一個重要的應用方式,通過指定HyperlinkButton的NavigateUri屬性,實現導航,具體實現:
<HyperlinkButton Content="點擊跳轉" Height="30" HorizontalAlignment="Left" Margin="28,41,0,0" Name="myHyperlinkButton" VerticalAlignment="Top" Width="200" NavigateUri="/MyPage.xaml"/>
在代碼中進行導航
通過頁面的NavigationService來實現,NavigationService在這里是頁面PhoneApplicationPage的一個屬性,取主機用於導航到此頁的服務,實際是返回一個NavigationService類型的值,相當於是實例化一個NavigationService的對象。同理,用於接收參數的NavigationContext也是PhoneApplicationPage的一個屬性,獲取包含有關導航請求的信息的對象,實際上是返回一個NavigationContext類型的屬性值,相當於是創建了一 個NavigationContext 的實例。
具體實現:定義一個按鈕,給按鈕添加Click事件,以實現導航。
this.NavigationService.Navigate(new Uri("/MyPage.xaml", UriKind.Relative));
返回操作
就是當在一個頁面中操作完成后,返回到前一個頁面中進行操作。
方法一:
使用代碼:NavigationService.GoBack()。
方法二:
使用返回鍵實現返回操作。
補充:禁用返回按鍵的返回操作。給當前頁面添加BackKeyPress事件,使用e.Cancel=true;的方式來禁用返回按鍵。
別名導骯
即定義系統資源,使用別名來實現導航。WP7頁面導航可以使用路徑別名,是從Silverlight繼承來的。使用的方法涉及到資源的定義。方法如下:
首先,在App.xaml的文件中添加Windows.Navigation 命名空間:mlns:navigate="clr-namespace:System.Windows.Navigation;assembly=Microsoft.Phone"。
其次,書寫資源代碼:
<Application.Resources> <navigate:UriMapper x:Key="UriMapper"> <navigate:UriMapping Uri="MyNewPage" MappedUri="/MyPage.xaml"/> </navigate:UriMapper> </Application.Resources>
最后,給Frame添加UriMapper :this.RootFrame.UriMapper = Resources["UriMapper"] as UriMapper;即將這句代碼寫到App類的構造函數中。
在使用的時候,就像之前的應用一般,只是在路徑名中直接書寫路徑別名就行了。
NavigationService.Navigate(new Uri("NewPage", UriKind.Relative));
五種頁面間參數傳遞的方法
直接在Uri中添加
類似於web中的參數的傳遞方法,在Uri中使用”?id=‘’&name=‘’“的方式添加需要傳遞的參數。當然這不會局限於后台代碼或者是HyperlinkButton的NavigateUri屬性中,如:
this.NavigationService.Navigate(new Uri("/MyPage.xaml?flag=test",UriKind.Relative));
或:
<HyperlinkButton Content="點擊跳轉" Height="30" HorizontalAlignment="Left" Margin="28,41,0,0" Name="myHyperlinkButton" VerticalAlignment="Top" Width="200" NavigateUri="/MyPage.xaml?flag=test"/>
使用路徑別名中傳遞參數
在資源的定義中,我們可以定義這樣的資源:
<Application.Resources>
<navigate:UriMapper x:Key="UriMapper">
<navigate:UriMapping Uri="NewPage/{param}" MappedUri="/MyPage.xaml?ID={param}"/>
</navigate:UriMapper>
</Application.Resources>
這樣通過定義之后,在使用的時候new Uri("NewPage/10", UriKind.Relative));就行了,在實際使用中,如果我們在定義資源Uri的時候,使用的名稱和將要轉到的頁面的名稱一致的話,會出現以下三種效果功能相同的使用方式:
/NewPage.xaml?ID=10
NewPage?ID=10
NewPage/ID=10
對於以上兩種傳遞參數的方式,在接受的時候,使用NavigationContext。具體方法:
if (NavigationContext.QueryString.Keys.Contains("flag")) { NavigationContext.QueryString.TryGetValue("flag", out flag); myTextBlock1.Text=flag; }
為了很好的使用參數,避免異常等情況發生,在獲取數據的時候最好先判斷參數是不是存在。
配合獨立存儲傳遞參數
在導航的時候,配合獨立存儲,將需要傳遞的參數保存在獨立存儲中,由於一般傳遞的參數不會很大,筆者覺得使用IsolatedStorageSetting就行了。如在傳遞的時候:
private void btnNavigate5_Click(object sender, RoutedEventArgs e) { IsolatedStorageSettings iss = IsolatedStorageSettings.ApplicationSettings; iss["ID2"] = 10; NavigationService.Navigate(new Uri("NewPage", UriKind.Relative)); }
而在接受的時候:
IsolatedStorageSettings iss = IsolatedStorageSettings.ApplicationSettings; if (iss.Contains("ID2")) { this.myTextBlock1.Text=iss["ID2"].ToString(); }
這樣也算是很方便的實現了數據的傳遞。
PhoneApplicationService傳遞參數
這個類提供對應用程序生存期各個方面的訪問。這包括對應用程序空閑行為的管理以及當應用程序變為活動或不活動時對應用程序狀態的管理。在這里主要是用到了它的state屬性,獲取用於調用之間傳遞應用程序狀態的詞典,用來存儲數據。方法:
在將要跳轉的頁面中重寫方法OnNavigatedFrom,將需要傳遞的參數保存在State中:
PhoneApplicationService myService = PhoneApplicationService.Current; protected override void OnNavigatedFrom(NavigationEventArgs e) { myService.State["name"] = "sky"; base.OnNavigatedFrom(e); }
在將要跳轉到的頁面中重寫方法OnNavigatedTo,從State中讀取字典數據:
PhoneApplicationService myService = PhoneApplicationService.Current; protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { object name; if (myService.State.ContainsKey("name")) { if (myService.State.TryGetValue("name", out name)) { this.myTextBlock3.Text = name.ToString(); } } base.OnNavigatedTo(e); }
共享數據傳遞參數
另一種常用的頁面間共享數據的方法是使用公共資源App.xaml。在其后台代碼中加入相應屬性,即可使用。這種方法最經常用來傳遞對象,可以采用的辦法是創建兩個頁面都可以訪問到的靜態對象。
具體實現:
public string Name{set;get;}
public string Number{set;get;}
在使用的時候:
(Application.Current as App).Name
(Application.Current as App).Number
如定義屬性MyName,把需要傳遞的參數保存在共享數據中:
private void myTextBox_TextChanged(object sender, TextChangedEventArgs e) { (Application.Current as App).MyName = this.myTextBox.Text.ToString(); }
取得數據:
if ((Application.Current as App).MyName != "") { this.myTextBlock2.Text = (Application.Current as App).MyName; }
以上的各種方法,在我們的項目中最這樣的布局,其實就是簡單地實現:
實現結果為:
項目地址:http://files.cnblogs.com/waitingsky/NavigationPractice.rar