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 );
}