日期:2014-05-18  浏览次数:21283 次

C#入门学习-----图书阅读器(WPF 用户控件技术)

欢迎大家提出意见,一起讨论!

转载请标明是引用于 http://blog.csdn.net/chenyujing1234

需要源码请与我联系。

 

 编译平台:VS2008 + .Net Framework 3.5

        语言: C#

1、图书阅读器系统架构

1、2 系统架构设计

在这个系统中出现在的实体有图书目录、图书列表、图书、压缩格式的图书、图像缓存等。

(1) 文件夹可以直接定义为一个类。因为该对象相对固定,不同的文件夹除了名称唾位置不一样外,还可能会有一些其他变化的特性。

(2)每个文件夹包含多部书。因为图书的类型不是固定的,比如有压缩文件类型的图书和其他格式的图书,需要抽象出来实现一个接口

(3) 每本书包含多个页面。因为每个页面的格式是不同的,因些也需要进行抽象。

(4) 每本图书会包含一个图像缓存,该缓存提供的功能相对固定,当然也可以进一步抽象。

Catalog代表一个文件夹类,它包含代表该目录下所有图书的ObservableCollection<IBook>泛型集合类

IBook是抽象出来的代表一部图书的接口,它实现了INotifyPropertyChanged以便实现UI级别的绑定

BaseBook是一个实现了IBook接口的类,提供了对于每本图书的基本实现。

RarBook通过派生自BaseBook类,实现了压缩格式的图书对象

IBookItem接口是代表图书书页的接口,IBook接口包含一个类型为List<IBookItem>泛型集合,来表示一本书的所有图书页

RarPage实现了IBookItem接口,提供了对于RarBook类型图书的书页实现。

 

1、3 项目文件夹介绍

在此图中

Dependencies文件夹包含了项目中使用到的第三方类库或程序,比如pdftohtml.exe用于将pdf文件转换为Html格式。

                          SevenZipSharp.dll用于压缩或解压缩文件,使用的时候需要7z.dll来进行压缩或解压缩。

                         WPFToolkit.dll包含一些额外的控件来丰富WPF控件。

项目根目录下的app.config是应用程序配置文件。

 

2、系统核心类的实现

这一节将介绍如何实现。主要内容涵盖了.NET的反射、多线程、操作文件和文件夹知识,以及如何使用面向对象方式设计和实现类

2、1  实现图书目录Catalog类

图书阅读器每次在启动时,会根据在选项指定的文件路径异步加载图书到ListBox以显示书籍。

或者用户单击“打开”按钮,从弹出的打开文件窗口中选择一个文件。

Catalog会将该文件加载到其图书列表中,Catalog类要能从文件夹中枚举图书文件,也要能从特定文件中加载图书。

从图可以看出,Catalog包含实现了IBook接口的实例列表,作为其内含的图书。

因为该类不被设计用于继承或开,因此将该类指定为Internal.

 internal class Catalog


Catalog类定义了3个属性,分别用于指定文件路径、用于保存图书的列表及一个布尔值获取和设定图书变更信息

图书列表采用泛型集合,原因是因为它采用了集合通知。

#region -----------------属性区域-----------------

		private string _bookPath = string.Empty;//文件路径
		public string BookPath   //文件路径属性
		{
			get { return _bookPath; }//返回值
			set { _bookPath = value; }//设置值
		}
		private ObservableCollection<IBook> _Books =//图书集合
            new ObservableCollection<IBook>();
		public ObservableCollection<IBook> Books  //图书集合属性
		{
		  get { return _Books; }  //返回图书列表
		  set { _Books = value; } //设置图书列表
		}

		private bool _IsChanged = false;//是否变更
		public bool IsChanged  //是否变更属性
		{
			get { return _IsChanged; }  //返回变更
			set { _IsChanged = value; } //设置变更
		}

		#endregion


 当在选项中设置好图书的路径后,每次启动程序时,会从app.config中读取设置好的图书路径,再调用重载的确Load()方式从路径中加载图书。

Load有两个重载方法。

一个接受一个文件路径作为参数,该路径将会被赋给Catalog对象的BookPath属性;

另一个Load()方法会根据该属性的值来从目录中加载图书。Load带参数的重载方法实现如下:

   public void Load(string path)//该重载方法传入一个文件路径
		{
			try
			{
				_bookPath = path;//将路径指定给BookPath属性
				Load();          //调用不带参数的重载的Load方法
			}
			catch (Exception err) //在加载过程出现错误则触发异常
			{    //调用定制的异常管理窗口显示异常信息
				ExceptionManagem