wp7迷你飞信,WP7开发迷你框架G.Controls 介绍

很久没有写博客了,今天我给大家介绍一个我自己写的一个WP7开发框架G.Controls,首先我将罗列下目前WP7开发遇到的问题。
1.页面之间如何传递复杂的对象?
2.从当前页面返回前一页时如何将当前页的某些数据传递给前一页?
3.如何使得ListBox拥有分页功能?如何使得ListBox中数据在墓碑后自动回复到原来的数据?如何使得ListBox在墓碑后恢复到墓碑前滑动到的项?
4.如何截获附加属性的值的变化
5.如何获取某个UIElement所有子孙控件?在ScrollView滚动的时候如何获取屏幕最上边的控件?
以上种种问题在使用了本框架之后将得到很容易的解决,本人在设计的时候尽量的使得用最少的代码就可以实现以上功能,所以只要使用了本框架,那么你只需写很少的代码就能实现以上的功能。极大的提高开发一个复杂的应用程序的效率,我已经使用该框架开发了多个程序,包括一个电子商务的WP7软件,本人目前使用该框架开发的新浪微博客户端也是使用的该框架,单纯在列表的滑动流畅度方面绝对比新浪官方的流畅,欢迎大家试用。由于已经很长时间没有维护了,所以目前该微博程序还是有不少的Bug,还处于半成品状态,如有问题请直接在设置中给我发送邮件,谢谢!
新浪微博下载
如果要使用以上的功能,必须确保当前的页面是继承自GBasePage,添加命名空间: xmlns:gNavigate="clr-namespace:G.Navigate;assembly=G.Controls",然后将PhoneApplicationPage节点改成gNavigate:GBasePage。
我将使用新浪微博的数据来演示。
先添加两个类:Message和UserInfo
下面是Message的类
public class Message { [XmlElement("created_at")] public string CreatedTime { get; set; } [XmlElement("id")] public string Id { get; set; } [XmlElement("text")] public string Text { get; set; } [XmlElement("thumbnail_pic")] public string Thumbnail_pic { get; set; } [XmlElement("bmiddle_pic")] public string Bmiddle_pic { get; set; } [XmlElement("original_pic")] public string Original_pic { get; set; } [XmlElement("user")] public UserInfo User { get; set; } [XmlElement("source")] public Source Source { get; set; } [XmlElement("retweeted_status")] public Message Retweeted { get; set; } private Count count; public Count Count { get { return count; } set { if (count != value) { count = value; } } } } public class Count { [XmlElement("id")] public string ID { get; set; } [XmlElement("comments")] public int Comments { get; set; } [XmlElement("rt")] public int Rt { get; set; } } public class Source { [XmlElement("a")] public string Name { get; set; } }
以下是UserInfo的类:
public class UserInfo { [XmlElement("name")] public string NickName { get; set; } [XmlElement("screen_name")] public string ScreenName { get; set; } [XmlElement("id")] public string Id { get; set; } [XmlElement("description")] public string Description { get; set; } [XmlElement("gender")] public string Gender { get; set; } [XmlElement("profile_image_url")] public string HeadImage { get; set; } [XmlElement("province")] public string Province { get; set; } [XmlElement("city")] public string City { get; set; } [XmlElement("location")] public string Location { get; set; } /// /// 博客地址 /// [XmlElement("url")] public string Url { get; set; } /// /// 微博数 /// [XmlElement("statuses_count")] public string StatusesCount { get; set; } /// /// 关注数 /// [XmlElement("friends_count")] public string FriendsCount { get; set; } /// /// 粉丝数 /// [XmlElement("followers_count")] public string FollowersCount { get; set; } [XmlElement("following")] public bool Following { get; set; } [XmlElement("verified")] public bool verified { get; set; } [XmlElement("status")] public Message Message { get; set; } public string MaxHeadImag { get { return this.HeadImage.Replace("/50/", "/180/"); } } }
这里使用PageListBox来展示数据,添加命名空间: xmlns:gControls="clr-namespace:G.Controls;assembly=G.Controls"
然后使用PageListBox来展示数据:

然后在cs代码中插入以下代码:
protected override void _disibledevent=>base.OnNavigatedTo(e); this.listbox.EnableTombstoneListBox(this); }
上面这段代码是每当导航到当前页的时候就启用墓碑功能,这样,当墓碑后PageListBox会自动到恢复原来的数据。
private void listbox_BeginLoadData(object sender, G.Controls.PageEventArgs e) { System.Windows.Threading.DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer { Interval = TimeSpan.FromSeconds(2) }; timer.Tick += (a, b) => { XmlAttributes rootAttrs = new XmlAttributes(); rootAttrs.XmlRoot = new XmlRootAttribute("statuses"); XmlAttributeOverrides attrOvrs = new XmlAttributeOverrides(); attrOvrs.Add(typeof(GetMessagesResponse), rootAttrs); System.Xml.Serialization.XmlSerializer se = new System.Xml.Serialization.XmlSerializer(typeof(GetMessagesResponse), attrOvrs); GetMessagesResponse response = se.Deserialize(Application.GetResourceStream(new Uri("/PhoneApp2;component/weibo.xml", UriKind.Relative)).Stream) as GetMessagesResponse; this.listbox.LoadData(response.Messages); this.ShowState(string.Format("当前页{0},每页{1}条数据", e.PageNum, e.PageSize)); timer.Stop(); }; timer.Start(); }
以上代码是模拟从服务端获取数据,并且将XML数据转换成相对应的类,使用 this.listbox.LoadData(response.Messages);添加数据,this.ShowState(string.Format("当前页{0},每页{1}条数据", e.PageNum, e.PageSize));方法将会以一个黄条状的提示信息在屏幕最上那边提示信息。
以上工作以后,PageListBox就已经拥有了分页、墓碑、墓碑后自动滑动到墓碑前项的功能。
以下演示页面间数据的传递功能,就是将一个Message对象传递给下一页。
private void listbox_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (listbox.SelectedItem != null) { Message message = listbox.SelectedItem as Message; this.NavigationService.Navigate("/Page1.xaml", message); this.listbox.SelectedItem = null; } }
以上代码的核心是 this.NavigationService.Navigate("/Page1.xaml", message);这个方法将会将message传递给下一页。
在下一页中如何取数据?
protected override void _disibledevent=>base.OnNavigatedTo(e); Message message = this.NavigationContext.Param as Message; this.ContentPanel.DataContext = message; }
以上代码的核心就是this.NavigationContext.Param ,Param 就是前一页传递过来的参数,是要该参数能够被序列化,那么就不用担心墓碑后丢失的问题,因为我已经处理过了。
下面演示如何将当前页的数据传递给前一页:加入当前页有一个TextBox,当我返回到前一页的时候需要将TextBox的值传递给前一页,
首先在当前页添加TextBox和一个按钮

最新评论

发表评论