作為Toolkit的控制項之一的PhoneTextBox控制項是我非常喜歡用的一個小東西,原因很簡單,它內建一個預設的提示,當使用者沒有輸入即Text的值為String.Empty的時候,這個提示就會出現,而且顏色還很淺,而當使用者輸入任何內容之後,提示就會隱藏,這種操作方式很適合放在手機這種螢幕不大的裝置上,很省地方,比那種一個TextBlock加一個TextBox的方式明顯舒服很多。
但是前兩天測試發現一個問題,應用中有一個PhoneTextBox用來顯示使用者的地理位置,在GPS工作正常的情況下,它的Text值預設綁定成為GPS擷取座標之後解析出來的地址,而如果GPS工作不正常的時候,Hint的值顯示“GPS異常,請手動輸入您當前的地址”。這樣的設定再正常不過了,不是麼。
但是問題出現啦,具體複現:在啟動應用程式之前,在手機的設定裡把GPS關閉,啟動應用程式,PhoneTextBox正常提示“GPS異常,請手動輸入您當前的地址”,按開始鍵返回首頁面,再進入手機設定開啟GPS,然後不斷的按後退鍵返回剛才的應用程式,我的GPS資料擷取是在Loaded事件裡有一次,之後就只能手動按鈕重新整理了,顯然此時GPS沒有再次自動重新整理,然後我進入有手動按鈕重新整理的那個頁面(和PhoneTextBox不在同一個頁面),手動重新整理GPS座標,GPS座標和位置解析正常之後,按後退鍵返回有PhoneTextBox的那個首頁面,這個時候,問題出現啦:Hint提示的字串和Text顯示的地理位置共同出現在了PhoneTextBox裡,兩個字串交疊在這裡,異常難受。
這是一個BUG,簡單分析是由於把PhoneTextBox的Text值進行了雙向繫結,在另一個頁面裡重新整理GPS資料之後,PhoneTextBox的Text值相應的發生了改變,但由於PhoneTextBox這個頁面並未處於啟用狀態,所以PhoneTextBox的Hint的顯示沒有消失。
發現這個問題之後,我試圖手動監測PhoneTextBox的Text變化然後控制Hint的隱藏,但是發現這不是一個好辦法。後來,乾脆把GPS擷取的預設的地理位置也綁定到了Hint裡,並做了一個Converter如下:
public class NowAddressConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { string result = value.ToString(); if (result == "") { return "GPS異常,請手動輸入您當前的地址"; } else { string str = @"當前地址:"; if (value.ToString().StartsWith(str)) result = value.ToString(); else { result = str + value; } } return result; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return ""; }}
這樣就把GPS的資料和預設的提示都放在了Hint屬性裡,從而繞過了上面提到的那個Bug,這隻能算是一個臨時的解決辦法吧。
(備忘:我目前使用的Toolkit是2011.11月的最新版本,由NuGet下載)