前面在講述導航的知識,也講了控制項,也講了資源,樣式,模板,相信大家對UI部分的內容應該有了很直觀的認識了。那麼今天講什麼呢?不知道大家在練習導航的時候是否發現一個問題?
當我們向頁面傳遞一個參數的時候,是沒問題的,但是,如果我們在XAML中使用這樣的URI時,你敢保證它還能正常運行呢?
/PageaTest.xaml?name=小強&age=100
你發現,嘿,咋回事了?怎麼報錯了?不知道有沒有去思考,為什麼呢?
好,先問你一句,你學過Web開發嗎?或者說,瞭解HTML嗎?如果你瞭解,好,你已經找到答案了。
哈哈,對了,就是編碼和轉義的問題,“&”符號用在XAML中同樣需要轉義,但你一定發現了,如果把它換成轉義符,一來好像很難看,二來,也不太安全。大家知道,MVC中是使用什麼來訪問頁面的?是的,能過控制器的行為,而且是經過URI映射的。
同理,在Silverlight的導航中,也同樣需要的,在WP中依然適用。
先說一下不使用URI映射的情況下如何解決該問題。
對的,就是改用C#代碼來導航,這樣就可以避開了XAML轉義了。
private void button1_Click(object sender, RoutedEventArgs e)<br /> {<br /> NavigationService.Navigate(new Uri("/pageRec.xaml?a=你好&b=小傢伙", UriKind.Relative));<br /> }<br />
看看效果吧,怎麼樣,解決了嗎?
別高興著,主角還出場呢,今天我們講的URI映射,所以下面我們要用URI映射的方式來完美解決這問題。
用URI映射難嗎?不難,很簡單,我們用到兩個類:
1、UriMapper ,它用來管理映射的集合,它是頭目分子來的,很重要的哦,它下面可以有成千上萬的蝦兵蟹將。
2、UriMapping,這些傢伙是跟著UriMapper老大混飯吃的。
也就是說,一個UriMapper裡面可以包含1到N個UriMapping不等,一位老大可以帶領若干個馬仔,“兄弟上陣一群狼”就是這個道理。
可能由於各種原因,你的超級應用程式會有N多種映射方案,所以說允許N個UriMapping,你知道一支樂隊不可能個個都拉小提琴的,顯然需要其它樂器的配合。
好的,那麼,URI是如何映射的?相信玩過C#的朋友,一定會熟悉這種語句:
string ss = string.Format("你的人品值是:{0}", -100);
上面的{0}是預留位置,01234依次往下推,上面原理相信大家都懂,首先在“你的人品值是:{0}”中找到“{0}”,然後用-100為替換{0},所以上面的字串變為:你的人品值是:-100.
URI映射的原理是一樣的,比如:
/Student/{id} ----> /studentdetail.xaml?sid={id}
大家猜到上面的URI是怎麼映射的嗎?
看左邊,其它是多餘,是“偽”兵,用來迷惑敵人的,真正的資料是{id},而箭頭右邊就是真正的URI地址,它也有一個{id},對,它在左的偽URI中找到{id},然後用它的值來替換右邊的{id}。
理解嗎?例如我傳一個URI,/Student/201201030,而最終映射後的真實地是/studentdetail.xaml?sid=201201030,哈,現在明白嗎?
不明白?我再舉幾個,你自己研究一下看看找到規律沒有?
/cat/{cid} ---> /categ.xaml?id={cid}
/cat/5025 ---> /categ.xaml?id=5025
/{id}/{name} ----> /goodslist.xaml?gid={id}&gname={name}
/302/天地七號 -----> /goodslist.xaml?gid=302&gname=天地七號
/{sex}/{order}/{type} ----> /listmat.xaml?sex={sex}&acord={order}&swType={type}
/女/3/7 ------> /listmat.xaml?sex=女&acord=3&swType=7
至於為什麼要用“/”,呵呵,因為這個不用轉義嘛 ,二為,為了讓運行庫可以識別預留位置的位置,也可作為分隔字元,一舉兩得。
怎麼樣,有感覺了沒?還沒?不要緊,一起動手玩一玩就有感覺了。
第一步,開啟App.xaml.cs檔案,在App的建構函式中添加URI映射。
#region URI映射<br /> UriMapper mng = new UriMapper();<br /> UriMapping myMapping = new UriMapping()<br /> {<br /> Uri = new Uri("/page/{p1}/{p2}", UriKind.Relative),<br /> MappedUri = new Uri("/pageRec.xaml?a={p1}&b={p2}", UriKind.Relative)<br /> };<br /> mng.UriMappings.Add(myMapping);<br /> this.RootFrame.UriMapper = mng;<br /> #endregion<br />
然後,回到首頁,加入以代碼導航代碼。
<HyperlinkButton Content="通過URI映射的導航" Height="73" HorizontalAlignment="Left" Margin="12,286,0,0" Name="hyperlinkButton1" VerticalAlignment="Top" Width="327" NavigateUri="/page/你看/還是傳過來了" />