簡單的PDF檔案瀏覽程式
最近在熟悉WPF相關的環境以及操作方式,而日常作業中又常常會遇到需要使用PDF檔案的情況,PDF檔案一多時(尤其是都從email進來)說實在還真不是很好整理;所以想說是不是能夠做個小程式來瀏覽這些PDF檔案呢?於是就搞了這麼一個初版的小程式。
首先是參考的資料來源,Displaying a PDF file within a WPF application,裡面的說明相當的詳細,可以直接前往參考,下面所做的程式也是參考這篇而做的。這個做法是利用Adobe的ActiveX元件來做瀏覽的功能,所以在使用之前,目標電腦上至少必須要安裝Adobe Reader才能夠順利執行喔,這要特別注意一下。
接下來根據上面連結所提到的,在建立UserControler的時候在工具箱當中,要加入Adobe的原件,以方便我們將控制項拖拉到畫面上,這個部分可以在COM頁籤當中找到,像是下圖
簡單的做好UserControler之後,就要在主要的畫面(XAML檔案)加入這個UserControl了,而由於這是一個COM元件,所以必須要將他放在一個WindowsFormHost控制項當中,這可以在工具箱中找到
接下來在就是主畫面的部分,在功能的部分,我是想做到指定一個基本的資料夾,之後將該資料夾中所有的目錄列在第一層(利用Expender+StackPanel),目錄下面就列出所有PDF檔案,於是做了下面簡單的畫面
在Blend裡面UI的畫面看起來大概像下面這樣
好,接下來就來看看主要畫面的程式碼了
首先是參考的資料來源,Displaying a PDF file within a WPF application,裡面的說明相當的詳細,可以直接前往參考,下面所做的程式也是參考這篇而做的。這個做法是利用Adobe的ActiveX元件來做瀏覽的功能,所以在使用之前,目標電腦上至少必須要安裝Adobe Reader才能夠順利執行喔,這要特別注意一下。
接下來根據上面連結所提到的,在建立UserControler的時候在工具箱當中,要加入Adobe的原件,以方便我們將控制項拖拉到畫面上,這個部分可以在COM頁籤當中找到,像是下圖
簡單的做好UserControler之後,就要在主要的畫面(XAML檔案)加入這個UserControl了,而由於這是一個COM元件,所以必須要將他放在一個WindowsFormHost控制項當中,這可以在工具箱中找到
接下來在就是主畫面的部分,在功能的部分,我是想做到指定一個基本的資料夾,之後將該資料夾中所有的目錄列在第一層(利用Expender+StackPanel),目錄下面就列出所有PDF檔案,於是做了下面簡單的畫面
在Blend裡面UI的畫面看起來大概像下面這樣
好,接下來就來看看主要畫面的程式碼了
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.IO; namespace PDFViewer { ///於是乎,點擊左側列表的檔案名稱之後,就能在右邊看到PDF檔案內容了;以上給各位參考了。/// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { ucPDFViewer uc; string fileDir = @"C:\Order"; public MainWindow() { InitializeComponent(); uc = new ucPDFViewer(); this.PdfHost.Child = uc; //uc.LoadFile(@"C:\Order\1.pdf"); } private void Window_Loaded(object sender, RoutedEventArgs e) { //load file RefreshList(fileDir, spFileList); } private void RefreshList(string strDirPath, StackPanel mainList) { DirectoryInfo dirinfo = new DirectoryInfo(strDirPath); Expander newEntry = new Expander(); StackPanel newSP = new StackPanel(); newSP.Margin = new Thickness(15, 0, 0, 0); newEntry.Header = strDirPath; foreach (var item in dirinfo.GetFileSystemInfos()) { if ((item.Attributes & FileAttributes.Directory) != 0) { //資料夾 RefreshList(item.FullName,spFileList); } else { //檔案 if (item.Extension != ".pdf") continue; Label newFilename = new Label(); newFilename.Content = item.Name; newFilename.MouseLeftButtonDown += new MouseButtonEventHandler(labtmp_MouseLeftButtonDown); newSP.Children.Add(newFilename); } } newEntry.Content = newSP; mainList.Children.Add(newEntry); } private void labtmp_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Label lab = (Label)sender; StackPanel p = (StackPanel)lab.Parent; if (p != null) { Expander ep; ep = (Expander)p.Parent; uc.LoadFile(ep.Header.ToString() + @"\" + lab.Content.ToString()); } } private void btnRefresh_Click(object sender, RoutedEventArgs e) { if (!Directory.Exists(txtBaseDir.Text)) return; spFileList.Children.Clear(); RefreshList(txtBaseDir.Text, spFileList); } private void btnSelectDir_Click(object sender, RoutedEventArgs e) { System.Windows.Forms.FolderBrowserDialog dlgOpen = new System.Windows.Forms.FolderBrowserDialog(); if (dlgOpen.ShowDialog() == System.Windows.Forms.DialogResult.OK) { txtBaseDir.Text = dlgOpen.SelectedPath; spFileList.Children.Clear(); RefreshList(txtBaseDir.Text, spFileList); } } private void TextBlock_MouseEnter(object sender, MouseEventArgs e) { } } }
留言