亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

        鄒珺

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

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

        中圖分類號(hào):TP312 文獻(xiàn)標(biāo)識(shí)碼: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)閱讀書時(shí),可以指定書簽,并可以跳到指定的書籍。

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

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

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

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

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

        architecture)

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

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

        (1)文件夾可以直接定義為一個(gè)類。因?yàn)樵搶?duì)象相對(duì)固定,不同的文件夾除了名稱和位置不一樣之外,還可能會(huì)有一些其他變化的特性。

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

        (3)每本圖書包含多個(gè)頁面。因?yàn)槊總€(gè)頁面的格式是不同的,因此也需要進(jìn)行抽象。

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

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

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

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

        kernel class)

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

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

        3.2 定義圖書接口IBook

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

        3.3 圖書基類BaseBook

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

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

        public BaseBook(string filePath)

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

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

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

        3.5 圖書頁面接口IBookItem的定義

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

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

        ImageCache類是整個(gè)緩存功能的核心,該類的內(nèi)部包含一個(gè)嵌套類ImgInfo用來保存圖像信息。與多數(shù)緩存功能的實(shí)現(xiàn)一樣,ImageCache在內(nèi)部實(shí)際上也就是使用了 Lise對(duì)象在內(nèi)存中保存圖像信息。因?yàn)檫^多的圖像保存會(huì)占用系統(tǒng)太多的內(nèi)存,所以ImageCache提供了一些機(jī)制來實(shí)現(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)建該元素的線程來訪問。此時(shí)需要借助于WPF中提供的全新的Dispatcher類,該類提供了BeginInvoke()方法。BeginInvoke是異步調(diào)用的方法,在示例中大多數(shù)都使用了同步的Invoke()方法,該方法直到UI線程實(shí)際執(zhí)行完該委托后才返回。BeginInvoke是異步的,將立即返回。

        Dispatcher按優(yōu)先級(jí)對(duì)其隊(duì)列中的元素進(jìn)行排序。向Dispatcher隊(duì)列中添加元素時(shí)可指定10個(gè)級(jí)別。這些優(yōu)先級(jí)在DispatcherPriority枚舉中維護(hù),BookReader中在后臺(tái)線程中顯示異常信息的方法,該方法使用了Invoke()方法進(jìn)行同步調(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)先級(jí)別,然后使用了一個(gè)匿名委托來調(diào)用ExceptionManagement類的Manage()靜態(tài)方法,該匿名委托要符合ThreadStart委托的方法簽名[7]。

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

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

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

        }

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

        5 結(jié)論(Conclusion)

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

        參考文獻(xiàn)(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é)報(bào),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
        英語世界(2020年10期)2020-11-06 06:23:38
        圖書推薦
        南風(fēng)(2020年22期)2020-09-15 07:47:08
        Winner Takes All
        英語世界(2020年2期)2020-03-08 14:33:31
        歡迎來到圖書借閱角
        一種高效的RFID系統(tǒng)冗余閱讀器消除算法
        班里有個(gè)圖書角
        圖書推介
        一種RFID網(wǎng)絡(luò)系統(tǒng)中消除冗余閱讀器的高效算法
        欧美国产一区二区三区激情无套| 午夜视频在线观看国产19| 国产一区二区三区在线观看完整版 | 日本韩国亚洲三级在线| 亚洲日韩在线中文字幕综合| 人妻夜夜爽天天爽三区麻豆av网站| 亚洲色偷拍区另类无码专区| 国产精品免费久久久久影院仙踪林| 国产va精品免费观看| 国产精品亚洲在钱视频| 亚洲第一女人av| 亚洲综合色婷婷七月丁香| 久久亚洲sm情趣捆绑调教| 久久国产亚洲中文字幕| 极品新娘高清在线观看| 男人天堂网2017| 内射无码专区久久亚洲| 欧美日韩在线观看免费| 国产毛片三区二区一区| 国产精品久久免费中文字幕| 在线视频观看免费视频18| 中文字幕无码人妻丝袜| 东京热日本道免费高清| 国产精品久久国产精品99 gif| 激情 人妻 制服 丝袜| 国模少妇无码一区二区三区 | 日本精品一区二区高清| 国产xxxx99真实实拍| 亚洲 暴爽 AV人人爽日日碰| 日本一区二区三区丰满熟女| 中文字幕人妻第一区| 国内免费AV网站在线观看| 午夜少妇高潮免费视频| 国产18禁黄网站免费观看| 午夜不卡av免费| 国产福利美女小视频| 熟女人妻在线中文字幕| 少妇av射精精品蜜桃专区| 国产人澡人澡澡澡人碰视频| 日本大片一区二区三区| 国产又爽又大又黄a片|