Silverlight實例教程 - Out of Browser存取本地文件系統

作者: jv9  來源: 博客園  發布時間: 2010-08-12 20:57  閱讀: 1905 次  推薦: 0   原文鏈接   [收藏]  

  Silverlight 實例教程索引

  在前文,我們講述了Silverlight Out of Browser的基礎以及自定義模式應用。本篇,我們將講述Silverlight Out of Browser應用的重點 - 創建可信任應用,也稱為Trusted Application. 早在Silverlight 3,Silverlight Out of Browser的功能由于權限的限制無法很好的滿足用戶的正常存取需求,僅能實現將Web應用脫離瀏覽器。而在Silverlight 4中,通過提升應用信任權限,大大增強了Silverlight Out of Browser的功能,在權限允許的情況下,用戶可以自由有訪問本地目錄,也可以執行本地應用程序,另外通過調用COM組件,實現更多更強大的本地應用操作。下面我們將實例講述Silverlight Out of Browser可信任應用 - 存取本地文件系統。

  本篇中,我們將基于上篇教程提供的項目SilverlightOOBDemo進行演示操作。

  首先需要確認SilverlightOOBDemo項目允許用戶提升應用信任權限。這樣,OOB應用將被允許訪問用戶本地資源。

  Silverlight 4對于本地文件夾的存取,并非代表存取所有本地磁盤目錄,目前為止,Silverlight 4 API僅支持存取“我的文檔”,“我的音樂”,“我的圖片”和“我的視頻”目錄以及“Program Files”和“Cookies”目錄,而如果想對所有磁盤目錄進行訪問,則需要使用COM功能進行操作,我們將在下篇講述,本篇將著重講述Silverlight 4 API對“我的”系列目錄的操作方法。

  在實現具體功能前,首先需要為項目添加兩個新文件,一個是資源文件Resources.xaml,該資源文件引用自開源控件BlackLight資源樣式,主要目的是為了創建新按鈕演示效果,如下圖:

  另一個是小圖片控件ThumbImage.xaml,該文件是用于載入“我的圖片”目錄后的圖片略縮圖,其代碼較為簡單。

 1 <UserControl x:Class="SilverlightOOBDemo.ThumbImage"
 2     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 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     <Grid x:Name="LayoutRoot" Margin="10">
10         <Image x:Name="ThumbnailImage" Height="145" Width="225" />
11     </Grid>
12  </UserControl>
 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主窗口頁面添加按鈕控件,其樣式調用自資源文件Resources.xaml,對于資源樣式調用,這里不再贅述,如果不明白的,請看“Expression Blend實例中文教程系列文章

 1 <StackPanel x:Name="toolbar" Background="#FF3A3A3A" Grid.ColumnSpan="2" Orientation="Horizontal" Margin="0,0,0,1" Grid.Row="0" >
 2                         <Border BorderBrush="{StaticResource GlossyBlack_StrokeGradient}" BorderThickness="1" CornerRadius="2" Margin="1" Padding="0,1,1,1">
 3                             <StackPanel>
 4                                 <StackPanel Orientation="Horizontal">
 5                                     <Button Width="56" Height="80" Style="{StaticResource BlackGlossyButton}" Margin="1,0,0,0" Foreground="White" x:Name="openFileBtn" Click="openFileBtn_Click">
 6                                         <Button.Content>
 7                                             <StackPanel>
 8                                                 <Image VerticalAlignment="Top" HorizontalAlignment="Center" Source="/SilverlightOOBDemo;component/Images/Open.png" Margin="0,-5,0,0" Stretch="None" />
 9                                                 <TextBlock VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0,3,0,0" Text="瀏覽" TextWrapping="Wrap"/>
10                                             </StackPanel>
11                                         </Button.Content>
12                                     </Button>
13                                 </StackPanel>
14 
15                             </StackPanel>
16                         </Border>
17 
18                         <Border BorderBrush="{StaticResource GlossyBlack_StrokeGradient}" BorderThickness="1" CornerRadius="2" Margin="1" Padding="0,1,1,1">
19                             <StackPanel>
20                                 <StackPanel Orientation="Horizontal">
21                                     <Button IsTabStop="False" Width="56" Height="80" Style="{StaticResource BlackGlossyButton}" Margin="1,0,0,0" Foreground="White"  x:Name="aboutBtn" Click="">
22                                         <Button.Content>
23                                             <StackPanel>
24                                                 <TextBlock VerticalAlignment="Top" HorizontalAlignment="Center" Text="?" FontSize="20" FontWeight="Bold" Foreground="DarkCyan"  Margin="0,-5,0,0" />
25                                                 <TextBlock VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0,3,0,0" Text="幫助" TextWrapping="Wrap"/>
26                                             </StackPanel>
27                                         </Button.Content>
28                                     </Button>
29                                 </StackPanel>
30                             </StackPanel>
31                         </Border>
32                     </StackPanel>

  同時,為了能夠載入本地“我的圖片”目錄中的圖片文件,我們需要在OutofBrowserMainpage中使用一個ListBox控件,載入上面我們創建的ThumbImage控件來顯示,所有圖片略縮圖列表。

1 <ListBox Grid.Column="0"  x:Name="lsMyPictures" SelectionMode="Single" Style="{StaticResource GlossyBlackListBox}" ItemContainerStyle="{StaticResource ListBoxItemStyle}" BorderBrush="Transparent" Background="Transparent" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" Margin="3,10,0,30" ></ListBox>

   現在,我們可以為openfilebtn按鈕控件創建事件,使其響應用戶操作,打開對應目錄進行文件瀏覽。

 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         }

  在上面代碼中,如果用戶已經提升了OOB應用權限(Application.Current.HasElevatedPermissions),將通過Environment中的GetFolderPath方法獲取到本地“My..”目錄下的文件,其中Environment.SpecialFolder可以設定特殊目錄。更多詳細,請看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應用對本地目錄的瀏覽。其效果如下:

  通過以上的代碼,我們可以快速修改,瀏覽“我的文檔”,“我的音樂”和“我的視頻”等目錄;在OutofBrowserMainPage頁面添加代碼:

1 <ListBox Grid.Column="1"  x:Name="lsMyDocuments" SelectionMode="Single" Style="{StaticResource GlossyBlackListBox}" ItemContainerStyle="{StaticResource ListBoxItemStyle}" BorderBrush="Transparent" Background="Transparent" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" Margin="3,10,0,30" ></ListBox>
1 private void AddDocToList()
2         {
3             var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
4             lsMyDocuments.ItemsSource = System.IO.Directory.EnumerateFiles(path);
5         }

  然后在openFileBtn_Click事件中調用AddDocToList();即可獲取到“我的文檔”文件列表, 其他目錄與其類似,就不再做代碼演示,大家可以自己嘗試,如果遇到問題,我們可以一起討論 。

  看到這里,有的朋友可能會問,既然已經可以實現瀏覽本地目錄功能,是不是也應該可以對本地目錄文件進行操作呢?答案是肯定的。當OOB應用獲取到權限提升后,則可以使用File類對文件進行操作,例如,移動文件,刪除文件等。對目前的項目我們進行簡單的修改,演示如何將“我的文檔”目錄的文件,移動到“我的音樂”目錄中,并且刪除源目錄的相同文件,

首先在OutofBrowserMainPage.xaml頁面添加一個新的ListBox,承載“我的音樂”目錄文件;

1 <StackPanel Orientation="Vertical" Width="200">
2                                     <TextBlock Text="我的音樂" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center"/>
3                                     <ListBox x:Name="lsMyMusics" SelectionMode="Single" Style="{StaticResource GlossyBlackListBox}" ItemContainerStyle="{StaticResource ListBoxItemStyle}" BorderBrush="Transparent" Background="Transparent" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" Margin="3,10,0,30"></ListBox>
4                                 </StackPanel>

   在后臺代碼添加,瀏覽載入“我的音樂”目錄;

 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 <StackPanel Orientation="Vertical" Width="200">
2                                     <TextBlock Text="我的文檔" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center"/>
3                                     <ListBox x:Name="lsMyDocuments" SelectionMode="Single" Style="{StaticResource GlossyBlackListBox}" ItemContainerStyle="{StaticResource ListBoxItemStyle}" BorderBrush="Transparent" Background="Transparent" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto" Margin="3,10,0,30"></ListBox>
4                                 </StackPanel>
 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          }

  運行后即可得到如下效果:

  下面我們想實現,點擊按鈕事件后,將“我的文檔”目錄中的選中文件,移動到“我的音樂”目錄中,首先,在應用的ToolBar中添加一個移動按鈕moveFileBtn。

  實現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文件類操作文件的移動和刪除,當然,這需要OOB應用被提升信任權限后,才可以操作,否則,將提示權限錯誤。

  這樣,我們就可以查看演示了,當運行應用后,“我的文檔”和“我的音樂”兩個目錄將被載入文件列表,選中“我的文檔”中任一文件,然后點擊“移動”按鈕,就會發現該文件被移動到“我的音樂”目錄中,而在“我的文檔”中的源文件已經被刪除。

  通過上文,我們可以了解到Silverlight Out of Browser的可信任應用對本地目錄和文件的操作方法以及基本API的用法,下一篇,我們將通過另外一個實例演示更多Out of Browser的可信任應用的強大功能。

  注:本篇部分代碼是參考Silverlight開源項目。

  本篇源代碼下載

0
0
 
標簽:Silverlight
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()