WP开发一些小注意点

本文介绍了在软件开发过程中关于墓碑状态、网络检测、UI线程处理、定时器使用等方面的调试技巧及注意事项,帮助开发者避免常见错误,提升应用程序的稳定性和用户体验。

一 、墓碑相关:

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()

修改为:

View Code

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

代码示例:
-------------------

View Code

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

View Code

(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>
View Code

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

View Code

 

转载于:https://www.cnblogs.com/sunwukonk/archive/2013/01/29/2881666.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值