在前文,我們講述了Silverlight Out of Browser的基礎(chǔ)以及自定義模式應(yīng)用 ,
Silverlight實例教程 Out of Browser存取本地文件系統(tǒng)
。本篇,我們將講述Silverlight Out of Browser應(yīng)用的重點 - 創(chuàng)建可信任應(yīng)用 ,也稱為Trusted Application. 早在Silverlight 3,Silverlight Out of Browser的功能由于權(quán)限的限制無法很好的滿足用戶的正常存取需求,僅能實現(xiàn)將 Web應(yīng)用脫離瀏覽器。而在Silverlight 4中,通過提升應(yīng)用信任權(quán)限,大大增強 了Silverlight Out of Browser的功能,在權(quán)限允許的情況下,用戶可以自由有 訪問本地目錄,也可以執(zhí)行本地應(yīng)用程序,另外通過調(diào)用COM組件,實現(xiàn)更多更強 大的本地應(yīng)用操作。下面我們將實例講述Silverlight Out of Browser可信任應(yīng) 用 - 存取本地文件系統(tǒng)。本篇中,我們將基于上篇教程提供的項目SilverlightOOBDemo進行演示操作。
首先需要確認SilverlightOOBDemo項目允許用戶提升應(yīng)用信任權(quán)限。這樣, OOB應(yīng)用將被允許訪問用戶本地資源。
Silverlight 4對于本地文件夾的存取,并非代表存取所有本地磁盤目錄,目 前為止,Silverlight 4 API僅支持存取“我的文檔”,“我的音樂”,“我的圖片 ”和“我的視頻”目錄以及“Program Files”和“Cookies”目錄,而如果想對 所有磁盤目錄進行訪問,則需要使用COM功能進行操作,我們將在下篇講述,本篇 將著重講述 Silverlight 4 API對“我的”系列目錄的操作方法。
在實現(xiàn)具體功能前,首先需要為項目添加兩個新文件,一個是資源文件 Resources.xaml,該資源文件引用自開源控件BlackLight資源樣式,主要目的是 為了創(chuàng)建新按鈕演示效果,如下圖:
另一個是小圖片控件ThumbImage.xaml,該文件是用于載入“我的圖片”目錄后 的圖片略縮圖,其代碼較為簡單,
1
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5 xmlns:mc="http://schemas.openxmlformats.org/markup- compatibility/2006"
6 mc:Ignorable="d"
7 d:DesignHeight="300" d:DesignWidth="400">
8
9
10
11
12
1 namespace SilverlightOOBDemo
2 {
3 public partial class ThumbImage : UserControl
4 {
5 private Image _OriginalImage;
6 public Image OriginalImage
7 {
8 get
9 {
10 return _OriginalImage;
11 }
12 set
13 {
14 this._OriginalImage = value;
15 ThumbnailImage.Source = new WriteableBitmap(_OriginalImage, null);
16 }
17 }
18
19 public ThumbImage()
20 {
21 InitializeComponent();
22 }
23 }
24 }
為了能夠激活存取事件,我們需要在OutofBrowserMainpage主窗口頁面添加按 鈕控件,其樣式調(diào)用自資源文件Resources.xaml,對于資源樣式調(diào)用,這里不再 贅述,如果不明白的,請看“Expression Blend實例中文教程系列文章”
1
2
3
4
5
13
14
15
16
17
18
19
20
21
29
30
31
32
同時,為了能夠載入本地“我的圖片”目錄中的圖片文件,我們需要在 OutofBrowserMainpage中使用一個ListBox控件,載入上面我們創(chuàng)建的ThumbImage 控件來顯示,所有圖片略縮圖列表,
1
現(xiàn)在,我們可以為openfilebtn按鈕控件創(chuàng)建事件,使其響應(yīng)用戶操作,打開 對應(yīng)目錄進行文件瀏覽
1 private void openFileBtn_Click(object sender, RoutedEventArgs e)
2 {
3 if (Application.Current.HasElevatedPermissions)
4 {
5 var imageFiles = Directory.EnumerateFiles(Environment.GetFolderPath (Environment.SpecialFolder.MyPictures), "*.jpg", SearchOption.AllDirectories);
6 foreach (var imagePath in imageFiles)
7 {
8 AddImageToList(new FileInfo(imagePath));
9 }
10 }
11 }
在上面代碼中,如果用戶已經(jīng)提升了OOB應(yīng)用權(quán)限 (Application.Current.HasElevatedPermissions),將通過Environment中的 GetFolderPath方法獲取到本地“My..”目錄下的文件,其中 Environment.SpecialFolder可以設(shè)定特殊目錄,
電腦資料
《Silverlight實例教程 Out of Browser存取本地文件系統(tǒng)》(http://clearvueentertainment.com)。更多詳細,請看MSDN解釋。在上面代碼中,有一個方法AddImageToList,將文件路徑信息讀取,然后將圖 片文件信息進行綁定到ListBox。
1 private void AddImageToList(FileInfo fileinfo)
2 {
3 FileStream fileStream = fileinfo.OpenRead();
4 Image img = new Image();
5 BitmapImage bi = new BitmapImage();
6 bi.SetSource(fileStream);
7 img.Margin = new Thickness(5d);
8 img.Stretch = Stretch.UniformToFill;
9 img.Source = bi;
10 try { img.Tag = fileinfo.FullName; }
11 catch { }
12 ThumbImage thumbnail = new ThumbImage ();
13 thumbnail.OriginalImage = img;
14 lsMyPictures.Items.Add (thumbnail);
15 }
在讀取“我的圖片”目錄信息后,將各個圖片載入到ThumbImage控件中,然后 使用ListBox承載各個圖片,這樣也就完成了OOB應(yīng)用對本地目錄的瀏覽。其效果 如下:
通過以上的代碼,我們可以快速修改,瀏覽“我的文檔”,“我的音樂”和“ 我的視頻”等目錄;在OutofBrowserMainPage頁面添加代碼:
1
1 private void AddDocToList()
2 {
3 var path = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
4 lsMyDocuments.ItemsSource = System.IO.Directory.EnumerateFiles (path);
5 }
然后在openFileBtn_Click事件中調(diào)用AddDocToList();即可獲取到“我的文檔 ”文件列表, 其他目錄與其類似,就不再做代碼演示,大家可以自己嘗試,如果 遇到問題,我們可以一起討論 。
看到這里,有的朋友可能會問,既然已經(jīng)可以實現(xiàn)瀏覽本地目錄功能,是不是 也應(yīng)該可以對本地目錄文件進行操作呢?答案是肯定的。當(dāng)OOB應(yīng)用獲取到權(quán)限提 升后,則可以使用File類對文件進行操作,例如,移動文件,刪除文件等。對目 前的項目我們進行簡單的修改,演示如何將“我的文檔”目錄的文件 ,移動到“我的音樂”目錄中,并且刪除源目錄的相同文件,
首先在OutofBrowserMainPage.xaml頁面添加一個新的ListBox,承載“ 我的音樂”目錄文件;
1
2
3
4
在后臺代碼添加,瀏覽載入“我的音樂”目錄;
1 private void AddMusicToList()
2 {
3 var path = Environment.GetFolderPath(Environment.SpecialFolder.MyMusic);
4 lsMyMusics.Items.Clear();
5 DirectoryInfo myDirectory = new DirectoryInfo(path);
6 foreach (FileInfo file in myDirectory.EnumerateFiles())
7 {
8 lsMyMusics.Items.Add(file);
9 }
10 }
簡單修改“我的文檔”ListBox代碼,和后臺代碼:
1
2
3
4
1 private void AddDocToList()
2 {
3 var path = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
4 lsMyDocuments.Items.Clear();
5 DirectoryInfo myDirectory = new DirectoryInfo(path);
6 foreach (FileInfo file in myDirectory.EnumerateFiles())
7 {
8 lsMyDocuments.Items.Add(file);
9 }
10 //lsMyDocuments.ItemsSource = System.IO.Directory.EnumerateFiles (path);
11 }
運行后即可得到如下效果:
下面我們想實現(xiàn),點擊按鈕事件后,將“我的文檔”目錄中的選中文件,移動 到“我的音樂”目錄中,
首先,在應(yīng)用的ToolBar中添加一個移動按鈕moveFileBtn
實現(xiàn)moveFileBtn被點擊后,移動文件到“我的音樂”目錄,
1 private void moveFileBtn_Click(object sender, RoutedEventArgs e)
2 {
3 FileInfo selectedFile = (FileInfo) lsMyDocuments.SelectedValue;
4 string path = Environment.GetFolderPath(Environment.SpecialFolder.MyMusic);
5 string formatPath = string.Format("{0} \\{1}", path, selectedFile.Name);
6 if (!File.Exists(formatPath))
7 {
8 File.Move(selectedFile.FullName, formatPath);
9 File.Delete (selectedFile.FullName);
10 }
11 LoadFiles();
12 }
13
14 private void LoadFiles()
15 {
16 AddDocToList();
17 AddMusicToList();
18 }
這里我們用的是最基本的File文件類操作文件的移動和刪除,當(dāng)然,這需要 OOB應(yīng)用被提升信任權(quán)限后,才可以操作,否則,將提示權(quán)限錯誤。
這樣,我們就可以查看演示了,當(dāng)運行應(yīng)用后,“我的文檔”和“我的音樂” 兩個目錄將被載入文件列表,選中“我的文檔”中任一文件,然后點擊“移動” 按鈕,就會發(fā)現(xiàn)該文件被移動到“我的音樂”目錄中,而在“我的文檔”中的源 文件已經(jīng)被刪除。
通過上文,我們可以了解到Silverlight Out of Browser的可信任應(yīng)用對本地 目錄和文件的操作方法以及基本API的用法,下一篇,我們將通過另外一個實例演 示更多Out of Browser的可信任應(yīng)用的強大功能。
注:本篇部分代碼是參考Silverlight開源項目。
本文配套源碼