GNewsReader – 第二个WPF Application 开发笔记

GNewsReader是我自己写的第二个WPF Application,也是视觉中国Microsoft Expression 创意设计大赛的一个参赛作品。

你可以在这里下载到这个程序(Windows XP用户需要安装.net 3.0运行包

下面记录的是开发中遇到的问题,和解决方案。

1. 排版

这个应用的特点就是对整个新闻消息的排版,而我正是觉得WPF的排版可以比较简单的解决这个问题才开发了这个应用。

解决方案:

在排版上使用了custom panel,你可以在这里找到原型。

2. 数据绑定的状态

程序使用了Google News的RSS feed做为数据源,使用WPF的XML Data Provider将数据解析并绑定到control,因为XML Data Provider默认为异步连接,所以在下载数据时需要在界面上显示loading的动画。

解决方案:

重写OnInitialized函数,通过((INotifyPropertyChanged)XmlDataProvider).PropertyChanged和XmlDataProvider.DataChanged事件即可得到数据源的当前状态。

示例代码

3. 可拖动的窗口

因为使用了transparent window,所以默认去掉了窗口顶部的可拖动条,以及最大化、最小化、关闭按钮。那些按钮并不难做,只需要在应用上自定义几个按钮即可,但如何让窗口可以随意拖动呢?

解决方案:

其实只需要加一个这样的动作就可以了:

void Window1_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
this.DragMove();
}

实例代码

4. 如何将HTML转换成FlowDocument

加了一个FlowDocumentReader,但是数据源中的内容是HTML格式的,如何显示呢?

解决方案:

在WPF SDK team的blog上可以下载到XAML FlowDocument to HTML Conversion Prototype

用这个库里面的函数可以完成从HTML到FlowDocument的转换,然后用下面的语句可以将转换后的FlowDocument赋给FlowDocumentReader的Document属性。

string strXaml = HtmlToXamlConverter.ConvertHtmlToXaml(txt.Text, true);
StringReader strreader = new StringReader(strXaml);
XmlTextReader xmlreader = new XmlTextReader(strreader);
object obj = XamlReader.Load(xmlreader);
reader.Document = (FlowDocument)(obj);

5. 如何循环播放动画

在Blend中可以比较方便的创建动画,不过似乎还不能对动画进行更多的设置,比如循环播放。

解决方案:

切换到Xaml View, 找到Animation对象,并给它加上下面的属性:

RepeatBehavior=”Forever”

6. 如何在外部浏览器中打开链接

无论是Window中的Hyperlink还是FlowDocumentReader中的Hyperlink,默认情况下都是不能直接在外部浏览器中被打开的,于是导致所有链接点了都没有用的情况出现。

解决方案:

最佳的办法是利用到Hyperlink.RequestNavigate,因为它是一个RoutedEvent,所以只需要把它加到包含Hyperlink的上一级Panel,或者直接加到Windows的属性中,例如:

 

 

然后处理这个event:

void OnHyperlinkRequestNavigate( object sender, RequestNavigateEventArgs e )
{
Process.Start( e.Uri.AbsoluteUri );
}

示例代码