终于做完了一个完整的应用,code name叫Whisper,以后有机会发到marketplace上。

先不说这个应用是干什么的了,把开发过程中突破的技术问题总结一下。

 

难题1:Listbox控件自动回弹无法停留,看不到最底下的items

原因:这是因为把Listbox放在了StackPanel布局下,因为StackPanel是动态的,不知道自己占多大空间。而Listbox使用数据绑定时也不知道自己占多大空间。他俩都不知道,于是就导致了这个悲剧。

解决:把StackPanel换成Grid,让Grid的Height属性="*"

 

难题2:ContextMenu用了数据绑定后,ContextMenuItem中原本可以显示的图片无法显示

原因:和ApplicationBar里的按钮图片无法显示的原因一样,微软真是应该解决这个问题,至少把图片的默认BuildAction改成Content。

解决:把BuildAction改成Content就好了。

 

难题3:实现了INotifyPropertyChanged接口,但绑定目标的数据未更新

原因:调式发现PropertyChanged事件的值为null,因此不会走下面通知属性变化的流程。

解决:一开始是在页面构造函数里给DataContext赋值的,后来放到页面的Load事件处理函数中,问题解决。

 

难题4:TextBox中文字透明度渐变不能及时响应

原因:如果你改了TextBox的文字,会实时响应,但如果是Foreground.Opacity属性,则要等到再有TextBox控件获得焦点后才会响应。

解决:让TextBox控件获得焦点,透明度渐变就会开始。但是这样会使得SIP(Soft Input Panel)弹出来,即便你立刻再把Focus移到别的控件上,SIP也会闪一下,影响体验。

解决:让TextBox.IsReadOnly=true,就不会弹出SIP了。只要以下三行代码:

textBox1.IsReadOnly=true;

textBox1.Focus();

textBox1.IsReadOnly=false;

 

难题5:TextBox的滚动条失效

原因:这应该是微软的一个设计缺陷。

解决:那么在需要编辑长文本时怎么办呢。另一个缺陷也不得不提,就是RichTextBox的IsReadOnly不能设置为true,否则会在运行时解析XAML失败。或换用webbrower打开一个自制的内嵌input的页面,这种做法太费周折。

最终也没有完美解决。给TextBox外层套一个ScrollViewer,但滑动后会弹回到输入光标所在的位置,即还原到滑动之前的视图。网上说如果是TextBlock的话,给TextBlock外层套上一个Grid就行了。<ScrollViewer><Grid><TextBlock/></Grid></ScrollViewer>,但是TextBox试过不成功。哪位高人知道多谢指点。不过也由此可见,在移动应用上还是不要让用户输入太多文字。

 

 

难题6:在TextBox中输入英文没有单词自动提示

原因:没有设置InputScope属性。但奇怪的是中文是有词提示的。

解决:将InputScope属性设为Text。

posted on 2011-11-22 13:03  MainTao  阅读(806)  评论(1编辑  收藏  举报