最近在熟悉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的畫面看起來大概像下面這樣
好,接下來就來看看主要畫面的程式碼了
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
{
///
/// 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)
{
}
}
}
於是乎,點擊左側列表的檔案名稱之後,就能在右邊看到PDF檔案內容了;以上給各位參考了。