国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于WPF的圖書閱讀器的設(shè)計與實現(xiàn)

2017-10-28 06:42鄒珺
軟件工程 2017年9期
關(guān)鍵詞:閱讀器圖書

鄒珺

摘 要:隨著互聯(lián)網(wǎng)的興起,各種圖書閱讀器也應(yīng)運而生,它們能提供類似紙張閱讀感受的功能。為了讓用戶方便、快捷地管理指定文件夾下的圖書,圖書閱讀器能實現(xiàn)圖書閱讀,并可以讀取壓縮包中的圖片文件,支持一些特定的圖書格式。本文主要描述使用WPF這個UI端技術(shù)來生成一個圖書閱讀器,包括系統(tǒng)架構(gòu)、系統(tǒng)核心類的實現(xiàn),特別是在WPF中使用了多線程技術(shù)和事件路由技術(shù),讓用戶能夠靈活自如地使用該工具進行圖書閱讀。

關(guān)鍵詞:圖書;閱讀器;WPF

中圖分類號:TP312 文獻標(biāo)識碼:A

Abstract:A variety of book readers have come into being with the rise of the Internet,providing similar experience as paper reading.In order to allow users to manage the books in the specified folder conveniently and quickly,the book reader is designed to implement book reading,read picture files in a compressed file and supports some specific book formats.This paper mainly describes the book reader generated by using the UI technology of WPF,including the system architecture and the implementation of the system kernel class.Additionally,the multi-threading technology and the event routing technology are applied in WPF,which enable users to read books through this tool with ease.

Keywords:book;reader;WPF

1 引言(Introduction)

圖書閱讀器能提供以下功能:

(1)管理指定文件夾下的圖書,在圖書封面區(qū)中顯示圖書的封面。

(2)閱讀書時,可以指定書簽,并可以跳到指定的書籍。

(3)保存所有的狀態(tài),以便在下次繼續(xù)讀取書籍。

(4)提供對于壓縮的內(nèi)容訪問,實現(xiàn)圖像緩存管理。

(5)一旦一本書被打開,顯示里面的頁面和文件夾的結(jié)構(gòu)。

本文介紹使用WPF這個UI端技術(shù)開發(fā)圖書閱讀器,該閱讀器可以讀取壓縮包中的圖片文件,支持一些特定的圖書格式[1]。

2 圖書閱讀器系統(tǒng)架構(gòu)(Book reader system

architecture)

圖書閱讀器僅包含一個WPF應(yīng)用程序項目,由一個主窗體和多個用戶控件組成。

在這個系統(tǒng)中出現(xiàn)的實體有圖書目錄、圖書列表、圖書、壓縮格式的圖書、圖像緩存等。找出這些實體后,進行面向?qū)ο蟮某橄?,找出一些有共性的實現(xiàn)未抽象基類或接口,以便于應(yīng)對變化,而一些未變的可以直接定義為類,分析如下:

(1)文件夾可以直接定義為一個類。因為該對象相對固定,不同的文件夾除了名稱和位置不一樣之外,還可能會有一些其他變化的特性。

(2)每個文件夾包含多部書。因為圖書的類型不是固定的,比如有壓縮文件類型的圖書和有其他格式的圖書等,需要抽象出來實現(xiàn)為一個接口。

(3)每本圖書包含多個頁面。因為每個頁面的格式是不同的,因此也需要進行抽象。

(4)每本圖書會包含一個圖像緩存,該緩存提供的功能相對固定,當(dāng)然也可以進行進一步抽象,不過在本示例中將實現(xiàn)為一個單一的類,以求簡化[2]。

經(jīng)過上述分析,可以得出如圖1所示的類結(jié)構(gòu)圖

Catalog代表一個文件夾類,它包含代表該目錄下所有圖書的ObservableCollection泛型集合類。IBook是抽象出來的代表一部圖書的接口,它實現(xiàn)了INotifyPropertyChanged以便實現(xiàn)UI級別的綁定。BaseBook是一個實現(xiàn)了IBook接口的基類,提供了對于每本圖書的基本實現(xiàn),RarBook通過派生自BaseBook類,實現(xiàn)了壓縮格式的圖書對象。IBookItem接口是代表圖書書頁的接口,IBook接口包含一個類型為List泛型集合,來表示一本書的所有圖書頁。RarPage實現(xiàn)了IBookItem接口,提供了對于RarBook類型圖書的書頁實現(xiàn)。ImageCache是每本書包含的圖像緩存信息的對象[3]。

3 系統(tǒng)核心類的實現(xiàn)(Implementation of system

kernel class)

3.1 實現(xiàn)圖書目錄Catalog類

Catalog類定義了三個屬性,分別用于指定文件路徑、用于保存圖書的列表及一個布爾值獲取和設(shè)定圖書變更信息,屬性定義代碼如下:

3.2 定義圖書接口IBook

IBook接口被Catelog引用,使用這種基于接口的方式可以實現(xiàn)程序間的解耦,使程序具有良好的可擴充性。IBook接口定義了一本書需要具備的基本契約,實現(xiàn)代碼如下:

3.3 圖書基類BaseBook

BaseBook實現(xiàn)了IBook接口,同時也要實現(xiàn)INotifyPropertyChanged接口的成員,BaseBook內(nèi)部包含ImageCache實現(xiàn)圖像緩存。BaseBook的Pages包含實現(xiàn)了IBookItem接口的對象集合,CurrentPage用于顯示當(dāng)前的圖書頁面[5]。

BaseBook定義了八個屬性,這些屬性除了Pages是一個包含多個圖書頁面的泛型集合外,其他的都來自IBook接口的實現(xiàn)。該類重載了構(gòu)造函數(shù),提供了一個接收文件路徑的構(gòu)造函數(shù),當(dāng)文件路徑發(fā)生改變時,會觸發(fā)在INotifyPropertyChanged接口中定義的變更通知,構(gòu)造函數(shù)代碼如下:

public BaseBook(string filePath)

3.4 實現(xiàn)Rar壓縮文件格式的圖書

該類引用SevenZip類庫,并從BaseBook類中派生。由于SevenZipLib依賴于7z.dll這個類庫,因此在RarBook的構(gòu)造函數(shù)中,要先設(shè)置7z.dll類庫的路徑給SevenZipLib。RarBook類的構(gòu)造函數(shù)代碼如下:

在代碼中,RarBook的構(gòu)造函數(shù)需要傳遞兩個參數(shù):一個用來表示圖書的路徑,另一個布爾值用來確定是否需要為壓縮文件創(chuàng)建一個封面。首先調(diào)用基類的構(gòu)造函數(shù),然后獲取7z.dll的路徑,調(diào)用SevenZipExtrator類的靜態(tài)方法SetLibraryPath()為SevenZip指定庫路徑。如果需要為圖書創(chuàng)建封面的話,代碼將調(diào)用GenerateCover生成圖書封面[6]。

3.5 圖書頁面接口IBookItem的定義

圖書頁面類是包含在每一本圖書中的頁面的集合,因為BookReader將使用基于文件的頁面,比如壓縮包中的圖片文件,那么圖書頁面類需要具有文件路徑和文件名稱屬性。IBookItem提供了對于頁面類的基本定義,代碼如下:

3.6 實現(xiàn)緩存管理核心類

ImageCache類是整個緩存功能的核心,該類的內(nèi)部包含一個嵌套類ImgInfo用來保存圖像信息。與多數(shù)緩存功能的實現(xiàn)一樣,ImageCache在內(nèi)部實際上也就是使用了 Lise對象在內(nèi)存中保存圖像信息。因為過多的圖像保存會占用系統(tǒng)太多的內(nèi)存,所以ImageCache提供了一些機制來實現(xiàn)緩存數(shù)據(jù)的新增、修改和移除工作。ImgInfo類的定義和ImageCache類的構(gòu)造函數(shù)代碼如下:

4 WPF關(guān)鍵技術(shù)(Key technology of WPF)

4.1 在WPF中使用多線程

WPF與Windows Forms一樣,UI元素只能由創(chuàng)建該元素的線程來訪問。此時需要借助于WPF中提供的全新的Dispatcher類,該類提供了BeginInvoke()方法。BeginInvoke是異步調(diào)用的方法,在示例中大多數(shù)都使用了同步的Invoke()方法,該方法直到UI線程實際執(zhí)行完該委托后才返回。BeginInvoke是異步的,將立即返回。

Dispatcher按優(yōu)先級對其隊列中的元素進行排序。向Dispatcher隊列中添加元素時可指定10個級別。這些優(yōu)先級在DispatcherPriority枚舉中維護,BookReader中在后臺線程中顯示異常信息的方法,該方法使用了Invoke()方法進行同步調(diào)用,代碼如下:

catch(Exception err) //如果產(chǎn)生異常

{

//在與UI相同的線程中調(diào)用異常顯示窗口

Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal,

(ThreadStart)delegate

{

//使用自定義的ExceptionManagement類

ExceptionManagement.Manage("Catalog:LoadCovers",err);

});

}

上述代碼的Invoke調(diào)用中,首先使用DispatcherPriority枚舉指定優(yōu)先級別,然后使用了一個匿名委托來調(diào)用ExceptionManagement類的Manage()靜態(tài)方法,該匿名委托要符合ThreadStart委托的方法簽名[7]。

4.2 WPF中的事件路由技術(shù)

路由事件的定義是由公共的靜態(tài)RoutedEvent成員加一個約定的Event后綴組成,路由事件需要在.NET事件系統(tǒng)中進行注冊。然后路由事件也有一個和普通的.NET事件一樣的事件定義,或者是一個事件包裝器,使得可以像使用普通事件那樣使用路由事件,也可以在XAML中使用事件特性語法添加事件。為WPF定義一個路由事件代碼如下:

public static readonly RoutedEvent ZoomChangedEvent=EventManager.

RegisterRoutedEvent("ZoomChangedEvent",RoutingStrategy.Bubble,typeof(ZoomChangedEventHandler),typeof(PageViewer));

public delegate void ZoomChangedEventHandler

(object sender,ZoomRoutedEventArgs e)

public event ZoomChangedEventHandler ZoomChanged

{

add{AddHandler(ZoomChangedEvent,value);}

remove{RemoveHandler(ZoomChangedEvent,value);}

}

在代碼中,定義了一個ZoomChangedEventHandler類型的委托,首先調(diào)用定義一個名為ZoomChangedEvent的RoutedEvent,通過調(diào)用EventManager.RegisterRoutedEvent()方法向WPF的事件系統(tǒng)注冊路由事件[8]。

5 結(jié)論(Conclusion)

本文介紹了使用WPF技術(shù)開發(fā)的圖書閱讀器,為了實現(xiàn)閱讀邏輯,使用面向?qū)ο蟮脑O(shè)計方式設(shè)計了多個類,以處理文件的打開和閱讀工作,對系統(tǒng)架構(gòu)、系統(tǒng)核心類的實現(xiàn),以及涉及的關(guān)鍵技術(shù)作了闡述,從中體現(xiàn)了WPF技術(shù)的強大功能。

參考文獻(References)

[1] Yang L,et al.A bi-direction authentication protocol for RFID based on the variable update in IOT[J].Proceedings of the 2nd International Conference on Computer and Applications ASTL,2013(02):82-83.

[2] Xie L,et al.Continuous scanning with mobile reader in RFID systems:an experimental study[J].Proceedings of the Fourteenth ACM International Symposium on Mobile Ad Hoc Networking and Com putting,2009(08):167-168.

[3] Kazuya Sakai,et al.Wei-Shinn Ku,Roger Zimmermann,Min-Te Sun.Dynamic Bit Encoding for Privacy Protection against Correlation Attacks in RFID Backward Channel[J].IEEE Transactions on Computers,2013(04):212-213.

[4] 孫廣霞,張秀蘭.電子閱讀器在圖書館的推廣策略研究[J].圖書館學(xué)研究,2013(02):77-78.

[5] 趙慧真.電子閱讀器盛行引發(fā)圖書館服務(wù)工作的變革[J].四川圖書館學(xué)報,2013(05):121-122.

[6] 胡昌文,唐振貴,陳金菊.圖書館電子閱讀器內(nèi)容推送模式的探討[J].數(shù)字圖書館論壇,2016(10):32-33.

[7] 劉頌莉.電子閱讀器在圖書館的應(yīng)用探討[J].科技視界,2012

(22):55-56.

[8] 金紅亞,周德明.電子閱讀器應(yīng)用與圖書館借閱業(yè)務(wù)的變革[J].圖書館雜志,2010(04):135-136.

作者簡介:

鄒 珺(1981-),女,碩士,講師.研究領(lǐng)域:軟件開發(fā).endprint

猜你喜歡
閱讀器圖書
基于反向權(quán)重的閱讀器防碰撞算法
無障礙圖書聯(lián)盟
The Magna Carta
圖書推薦
Winner Takes All
歡迎來到圖書借閱角
一種高效的RFID系統(tǒng)冗余閱讀器消除算法
一種RFID網(wǎng)絡(luò)系統(tǒng)中消除冗余閱讀器的高效算法
盲人閱讀器
临朐县| 乡宁县| 庄河市| 陕西省| 家居| 桂东县| 策勒县| 东乌珠穆沁旗| 前郭尔| 安福县| 彭泽县| 韶山市| 宜州市| 威远县| 新津县| 浦县| 金坛市| 北安市| 任丘市| 亚东县| 中方县| 七台河市| 苏尼特左旗| 临西县| 鲁甸县| 汤原县| 梅州市| 佛教| 德清县| 丹棱县| 民和| 晋中市| 贵阳市| 正定县| 方城县| 铜梁县| 新营市| 通化市| 定州市| 浪卡子县| 内江市|