作为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下载)