在前文,我们讲述了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,1" GrID.Row ="0" >
2 < border borderBrush =" {StaticResource GlossyBlack_strokeGradIEnt} " borderThickness ="1" CornerRadius ="2" margin ="1" padding ="0,1,1" >
3 < StackPanel >
4 < StackPanel OrIEntation ="Horizontal" >
5 < button WIDth ="56" Height ="80" Style =" {StaticResource BlackGlossybutton} " margin ="1,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" Stretch ="None" />
9 < TextBlock VerticalAlignment ="Bottom" HorizontalAlignment ="Center" margin ="0,3,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" >
19 < StackPanel >
20 < StackPanel OrIEntation ="Horizontal" >
21 < button IsTabStop ="False" WIDth ="56" Height ="80" Style =" {StaticResource BlackGlossybutton} " margin ="1,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,0" />
25 < TextBlock VerticalAlignment ="Bottom" HorizontalAlignment ="Center" margin ="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,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,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,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,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开源项目。
本篇源代码下载
欢迎大家加入"专注Silverlight" 技术讨论群:
32679955(六群) 23413513(五群) 32679922(四群) 100844510(三群) 37891947(二群) 22308706(一群) 总结以上是内存溢出为你收集整理的Silverlight实例教程 - Out of Browser存取本地文件系统全部内容,希望文章能够帮你解决Silverlight实例教程 - Out of Browser存取本地文件系统所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)