標籤:
上班都是坐班車,很多TX肯定對租房子和買房子離班車網站近不近很上心。誰不想找個便宜的還能有班車的小區住啊(不差錢的可以直接無視我這屌絲行為了),於是我就想做一個應用,可以在使用者搜尋某個地點(比如心儀小區)時能顯示出搜尋地點附近的班車地點,另外計算下距這些班車網站都多遠。
好了,題外話說完了,下面說說開發過程吧。
自從出了universal app(跨平台 app程式),我就知道大事要發生了。微軟野心不小啊,採用universal APP 模式開發應用,使得統一應用在windows phone和windows store之間共用70%(微軟給的資料,哈哈,我可沒驗證)代碼,極大提速自己應用在平台的普及率。所以不用想了,現在搞必須直接從universal app搞起。對了,微軟還有個文檔,對universal app有這麼個說法,文章標題叫做《構建面向 Windows 和 Windows Phone 的通用 Windows 應用》,就是說 叫做通用windows應用(Universal Windows app)。這種開發方式總會成為技術主導,大家拭目以待。
又囉嗦了一堆,就在我按照Universal Windows app都建好工程,準備大幹一場時,出現第一個意外。
1第一個意外:windows phone 8.1地圖和windows 8.1地圖現在不是一回事啊
具體怎麼搜尋知道的都記不住了,就只記住結果了。隨便找一點分析下吧,windows phone 8.1開發地圖應用我們肯定會優先想到MapControl,這個類目前根據微軟文檔得到的資訊就是目前只支援Windows Phone 8.1。嘗試在windows 8.1項目中去引入MapControl和相關功能類都不行。
好吧,從知道這件事開始,我就知道我的universal windows app最核心的部分(地圖資料處理)肯定得是兩部分了。那肯定是從windows phone 8.1搞起啊。於是就有了下面文章的部分了。
2.從universal windows APP變成了windows phone 8.1 APP
請不要問我為什麼不是windows phone Silverlight 8.1 APP。我們要跟對方向Ok?以後的趨勢是基於完全的windows Runtime 架構的應用程式好麼。既然剛開始做,那麼肯定用以後會成為主流方向的那個模式啊。
好吧,到了這裡,最終決定開發的是windows phone 8.1應用程式。
3.開始建立介面吧,包括地圖地區,搜尋方塊,功能按鈕,大致就是這三塊吧。介面大致1所示:
圖1
好吧,你說看不到搜尋方塊,那是因為隱藏了啊,點擊功能按鈕地區的搜尋按鈕,就能開啟搜尋方塊了。2所示。
圖2
?
看一下UI架構,樹形結構,樹形結構是有
<Page>
????<Grid>
????????<TextBox/>
????????<StackPanel>
????????????<TextBlock/>
????????????<MapControl/>
????????</StackPanel>
????</Grid>
????<Page.BottomAppBar>
</Page.BottomAppBar>
</Page>
4.功能實現
4.1 初始化所有班車網站
這個主要是擷取各個班車網站的經緯度資訊。先是建立一個BusStation類,這個類主要是描述網站的一些資訊,包括經緯度和站名。這隻是我想到的。算是舉例子吧。對於一個產品來說,班車網站作為一個對象,其實還可以有別的屬性,比如所處街道,附近有什麼重要標誌或場所,被班車經過的時間等等,這些都可以歸屬到此班車網站上去。在項目之前,首先建立物件模型是非常重要的。只是這一點上我也還在學習,有興趣的可以看看《大象:Thinking in UML》。裡面講述了面對一個項目時如何用物件導向的觀點去分析,去建立模型對象。
有了BusStation,我們就可以將其轉化為UI相對應的對象MapIcon,給其賦予相應的屬性,然後將他們加入MapControl裡的MapElements,就可以顯示在地圖上了。
注意,MapElements可以添加的元素除了MapIcon,還包括images,和多邊形圍欄等等。
4.2 將當前地圖以老廠區為中心顯示
這個功能在開始的時候想的是以當前所在位置為中心顯示。但是這樣想過不太好。我覺得按照本來的需求沒有這個功能的需求。做了一下,覺得還是不好,現在就準備顯示是老廠區。這個功能實現最主要的就是TrySetViewAsync。她的作用就是將我們的視中心轉移到當前表徵圖地點上來。
這是一個非同步函數。充分利用了.net framework 4.5 和 Windows Runtime中對非同步支援。這項複雜的工作將會交由編譯器來搞定,我們就像是在使用同步代碼來編寫應用程式的邏輯結構,但其結果是,得到了所有非同步編程的優點,但只要付出一點點工作。
Await和async的例子可以參考http://cc.bingj.com/cache.aspx?q=.net+4.5+await+%e8%af%a6%e8%a7%a3&d=4729151226052614&mkt=zh-CN&setlang=zh-CN&w=8irFZ6SJ5uxmkYAa1kEEIGCSzmeXXwho
這裡就不多講了。
4.3 搜尋功能的實現
點擊搜尋按鈕,出現搜尋方塊,輸入搜尋文字,點擊斷行符號鍵,觸發搜尋操作。SearchTextBox_KeyUp,這個事件就是搜尋操作。利用MapLocationFinder.FindLocationsAsync我們可以擷取所有地點,然後再將其顯示在地圖上。
4.4 線路計算的實現
MapRouteFinder.GetDrivingRouteAsync利用擷取單條線路。再從中選擇我們需要的線路,並標註出來就可以了。
4.5 協助工具功能的實現
如何擷取下一個地點,放大或者縮小地圖的實現。
5.現階段的一些問題
我不知道是不是微軟API的問題,還是我沒有申請MAP key的緣故,總之,我使用MapLocationFinder搜尋時感覺不好用,搜尋出來的有時候不是想要的地點,或者乾脆搜尋不到。在MSDN裡也提問了,有人說是api還未完善所致,有的說使用bing的REST服務,容我有時間再研究了。
Windows Phone 8.1地圖應用開發