第一个windows phone 应用程序
写在这里来分享我写 列车助理 时遇到和解决的问题
1.使用 Microsoft.Phone.Controls.Toolkit.dll 时有些控件不显示正确图标
在程序根目录下新建 Toolkit.Content目录
在该目录下 添加 ApplicationBar.Cancel.png 和 ApplicationBar.Check.png
2.当加载数据时,使整个屏幕变暗
使用Popup+BackgroundWorker来实现
还有个滤镜处理的开源项目
3.提升xml查询的性能
我对算法不是怎么的敏感,所以什么复杂的算法我也搞不出来
原来我使用普通的查询,我查询一个 株洲 到 深圳这样的列车要8秒
后来我使用单实例模式,只加载xml数据文件一次
另外使用Dictionary 来存储比较数据
数据获取降到3秒
4.还是关于Dictionary ,这里是Dictionary 的本地存储
在.net平台中用XmlSerializer序列化Dictionary 是会出错的
用那个BinarySerializer可以序列化
但wp7中没有BinarySerializer
我查过很多资料都没有找到用XmlSerializer实现的方法,所以只好向另外的方法
我的解决方法是把Dictionary 数据转化成IList 数据,然后用XmlSerializer,或者转化成Json
写入到本地文件
View Code
public class JsonRule
{
/// <summary>
/// 生成Json格式
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static string GetJson<T>(T obj)
{
DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
using (MemoryStream stream = new MemoryStream())
{
json.WriteObject(stream, obj);
byte[] bt = stream.ToArray();
string szJson = Encoding.UTF8.GetString(bt ,0,bt.Length);
return szJson;
}
}
/// <summary>
/// 获取Json的Model
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="szJson"></param>
/// <returns></returns>
public static T ParseFromJson<T>(string szJson)
{
T obj = Activator.CreateInstance<T>();
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
return (T)serializer.ReadObject(ms);
}
}
public static string UrlEncodeUTF8(string value)
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentNullException("value", "待编码的值无效");
}
byte[] bytes = Encoding.UTF8.GetBytes(value);
StringBuilder builder = new StringBuilder();
foreach (byte num in bytes)
{
builder.AppendFormat("%{0:x}", new object[] { num });
}
return builder.ToString();
}
public static void Serialize(Stream streamObject, object objForSerialization)
{
if (objForSerialization == null || streamObject == null)
return;
XmlSerializer serializer = new XmlSerializer(objForSerialization.GetType());
serializer.Serialize(streamObject, objForSerialization);
}
public static object Deserialize(Stream streamObject, Type serializedObjectType)
{
if (serializedObjectType == null || streamObject == null)
return null;
XmlSerializer serializer = new XmlSerializer(serializedObjectType);
return serializer.Deserialize(streamObject);
}
// DataContractSerializer
}
5.toolkit:ListPicker在ScrollViewer中使用的问题
toolkit:ListPicker将不能正常打开,这是个bug
解决办法:添加 Tap 事件
View Code
private void ListPicker_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
e.Handled = true;
ListPicker lp = (ListPicker)sender;
lp.Open();
}
6.绘图
在wp7中绘图还真难了我好久,我以前没接触过silverlight.
找Griphs找了好久都没找到
在wp7中可改变的画布是 WriteableBitmap,你可以改变里面的像素点的颜色去绘图
我是没那么高的艺术修行,基本没发绘图
有个开源的库帮助画图 writeablebitmapex
但这个库不能 画string
后来 终于找到一个办法了
View Code
Canvas canvas = new Canvas();
...
TextBlock tbSD = new TextBlock();
tbSD.Text = string.Format("湿度 {0}", today.SD);
canvas.Children.Add(tbSD);
Canvas.SetTop(tbSD,15);
Canvas.SetLeft(tbSD, 15);
WriteableBitmap backgroundImage = new WriteableBitmap(canvas, null);
backgroundImage.Invalidate();
如果在后台更新别忘了把上面代码写在
View Code
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
{
。。。。
}
以免跨线程操作导致异常.
7.后台调试
当开启后台时,尽管参照官方的demo写代码,
写了
#if DEBUG_AGENT
ScheduledActionService.LaunchForTest(task.Name, TimeSpan.FromSeconds(60));
#endif
但测试官方的代码1分钟后后台被调用OnInvoke
而自己的却迟迟没有调用
感觉好邪恶的代码
经过仔细比较后我发现 官方demo在开启后台的那个代码文件上方有个 #define DEBUG_AGENT
通过这个程序我学会使用 Linq to xml ,photo 简单处理图片,windows phone的基本API
所以实践会驱动你学习,从项目中能学到很多
有时间多写项目
写在这里也希望给即将遇见上面问题的同学一个提醒
欢迎大家测试提交bug
也希望获得各种与软件有关无关的 建议
杂物:
列车助理Zune地址
数据库 :http://sqlitewindowsphone.codeplex.com/releases
二维码:http://zxingwindowsphone.codeplex.com/releases/view/56637
windows phone 示例代码 :http://msdn.microsoft.com/zh-cn/windowsphone/gg318625.aspx


浙公网安备 33010602011771号