一 、墓碑相关:
1. 设置工程的[tombstone upon deactivation while debuging],锁屏或者窗口键切除程序时会马上进入墓碑。这种情况只用于调试,正常情况下切除程序不会马上进入墓碑,程序本身的功能仍然会执行一段时间。
2. 使用PhotoChooserTask切出程序段时间内再回来时不是墓碑状态,但是如果[tombstone upon deactivation while debuging]为勾选状态,PhotoChooserTask启动切出程序后会立刻进入墓碑,从PhotoChooserTask返回程序时会被认为是从墓碑返回的。在调试的时候会出现与现实不一致的执行逻辑。需要注意。
3. 页面使用Timeer时,要特别注意切除程序,锁屏,墓碑时的处理。
二、网络相关:
1. 当手机连到计算机上时,即使手机所有网络和计算机网络都禁掉,通过DeviceNetworkInformation.IsNetworkAvailable check结果依然是有网络,此时如果发网络申请是失败的。只能通过回调来判断问题的原因。
当手机没有连接到电脑时,手机所有网络禁掉通过DeviceNetworkInformation.IsNetworkAvailable check结果为无网络。
综上,调试和实际应用时,无网络时走的逻辑是不一样的。需要注意!
三、其他
1. Deployment.Current.Dispatcher.BeginInvoke:
有时会遇到耗时UI线程逻辑阻塞UI元素更新,导致UI更新不及时的问题。需要将耗时的UI操作进行BeginInvoke。
例如:
(1)更新UI
(2)耗时的UI线程逻辑(BeginInvoke)
说明:(2)会延后处理,(1)会被及时的处理
2. Timer与DispatcherTimer区别
DispatcherTimer属于ui线程,Timer更新UI需要使用Dispatcher.BeginInvoke,而DispatcherTimer不需要。
采用Timer,使用Invoke或者BeginInvoke的方式进行UI的更新的方式好处在于:在DispatcherTimer里面执行等待动作或者时间过长,可能会导致UI假死!
DispatcherTimer MSDN:
http://msdn.microsoft.com/zh-cn/library/system.windows.threading.dispatchertimer(v=vs.95).aspx
运行于与用户界面线程 (UI) 的线程上
Timer MSDN:
http://msdn.microsoft.com/zh-cn/library/system.threading.timer(v=vs.95).aspx
计时器委托在构造计时器时指定,并且不能更改。 此方法不在创建计时器的线程上执行,而是在系统提供的 ThreadPool 线程上执行。
3. 有些特别的gif,直接使用GifParser和ImageTool是不能成功解析的。
原因是gif的结构有些不同。
比如:00000.gif,在读取第一帧信息后,比正常跨过后续的0的位多出一个0位,导致读取的需要继续解析的flag为0,退出解析帧循环。不能继续解析,从而只显示一帧内容。
解决方法:
//个别图片编码方式比较特别,ReadFrame后,
//获得blockSize(0的位数)有误,导致nextFlag读取为0,退出解码循环,无法正常解码
//需要将这些为0的跳过,直接到Label的位置
---------------
即将:
nextFlag = stream.ReadByte()
修改为:


4. 正则表达式替换或删除指定文本
举例:
(1)删除<pre></pre>标签
content = System.Text.RegularExpressions.Regex.Replace(content, @"<(\/)?pre[^>]*>", "", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
(2)删除非打印字符
在获取到Blog对象的Content时,需要过滤低位非打印字符,否则WebBrowser呈现时会崩溃。
把一个字符串中的低序位 ASCII 字符,替换成打印字符。
低位字符的ASCII码包括:
ASCII 0 - 8
ASCII 11 - 12
ASCII 14 – 31
用以下方法替换:
System.Text.RegularExpressions.Regex.Replace(HttpUtility.HtmlEncode(str),@"[\x00-\x08]|[\x0B-\x0C]|[\x0E-\x1F]", "[替换的字符]");
5. Parse和TryParse
Parse当字符串为null或者""时,会抛异常。所以尽量使用TryParse
bool.Parse(isHomePage)
6. RichTextBox的功能有很多,不仅仅只是一个普通的TextBox
详细:http://www.silverlightchina.net/html/tips/2010/1220/4295.html?1293374221
代码示例:
-------------------


6. TextBox自身的问题分析
(1)连续输入空格时,当输入到TextBox的最右端时继续输入,所在行左侧的文本内容会被挤出TextBox显示范围。
回避方法:
KeyDown事件回调中加入下面代码:


(2)GetRectFromCharacterIndex方法调用不当会抛异常,
自己调用的时候需要注意;
TextBox自身也会调用此方法。
输入框如果有这样的需求:
A.指定输入字数的上限,一旦输入达到上限会进行截断,只保留上限之内的文字。
B.支持文本框中的文本的上下滑动
(此时实现:TextBox外面套一个限定高度的ScrollViewer,TextBox本身不限定高度。)
会进行类似下面代码的处理:
ContentTxt.Text = ContentTxt.Text.Remove(MaxWordCount); ContentTxt.Select(selectedIndex, 0);
该处理中,TextBox内部会调用GetRectFromCharacterIndex方法。
到达最大限度后,中文输入法输入时,文本截断处理中会崩溃。
原因:
因为TextBox外面套了一个定高的ScrollViewer,截断时会计算Rect时出现异常。
所以,A,B目前看是矛盾的。
可以考虑:当字数超过限制后,用户如继续输入,则弹出提示提示用户。但是不进行文字截断。
在发送请求时再统一截断。
(3)双向绑定时,绑定的值改变时没有及时更新UI显示的问题
回避方法:
<i:Interaction.Behaviors> <Helper:UpdateTextBindOnPropertyChange/> </i:Interaction.Behaviors>


7. ListPicker改变每一项的UI式样

