虽然Silverlight已经是被抛弃的孩子了,但此前做的一些项目还是用到Silverlight。今天用Silverlight导入客户端本地的一个txt文件,然后读取需要的信息。随手记录一下,留作以后备忘。
网上也有不少的相关资料,但好像要么是单纯的Ctrl+C、Ctrl+V,要么是不够齐全。闲话少说,直接上代码。
我用的是MVVM模式,所以用RelayCommand命令打开了。其它的,直接在类似Button_Click事件里调用OpenFile(),同理。
1 /// <summary> 2 /// 打开文件 3 /// </summary> 4 private void OpenFile() 5 { 6 try 7 { 8 //检查是否是在OOB模式下运行 9 OOBChecker.CheckInstallState(() => 10 { 11 //弹出选择文件对话框 12 OpenFileDialog fileDialog = new OpenFileDialog() 13 { 14 Filter = "Txt Files (*.txt)|*.txt|All Files (*.*)|*.*", 15 }; 16 17 if (fileDialog.ShowDialog() == true) 18 { 19 //读取文件流 20 using (Stream fs = fileDialog.File.OpenRead()) 21 { 22 ReadTxtFile(fs); 23 fs.Close(); 24 } 25 } 26 }); 27 } 28 catch (Exception e) 29 { 30 31 //错误处理 32 } 33 }
注: OOBChecker.CheckInstallState,是为公司项目需要写的一个检查Silverlight程序是否在浏览器外运行的方法。众所周知,Silverlight是可以安装在本机脱离浏览器运行的,这样便可获得更高的执行权限。有时对本地文件(夹)进行操作时,程序需要获得信任权限。不知是否我浏览器设置问题,我直接在IE上运行,貌似也有权限。
附上OOBChecker的代码。
public class OOBChecker { /// <summary> /// 当前程序是否安装在本地 /// </summary> private static bool IsInstall { get; set; } /// <summary> /// 检查当前程序有没有安装在本地,callback是回调 /// </summary> public static void CheckInstallState(Action callback) { try { if (App.Current.HasElevatedPermissions) { //跳过OOB验证,直接在网页打开 if (callback != null) { callback(); return; } } if (App.Current.InstallState == InstallState.Installed) { if (App.Current.IsRunningOutOfBrowser) { IsInstall = true; //项目中操作Office COM需要 if (AutomationFactory.IsAvailable) { if (callback != null) { callback(); } } else { MessageWindow.CreateNew("您好,AutomationFactory IsAvailable Is False", resTipInformation.strApplicationTitle); } //App.Current.MainWindow.TopMost = true; } else { MessageWindow.CreateNew("您好,您已在本机安装了模块程序,请保存本页面数据后双击运行桌面的图标。", resTipInformation.strApplicationTitle); } } else { MessageWindow.CreateNewConfirm("打开文档之前需要安装本程序在您电脑上,确定帮您安装吗?为避免数据丢失,请确认前先保存数据。", resTipInformation.strApplicationTitle, () => { App.Current.InstallStateChanged += Current_InstallStateChanged; App.Current.Install(); }); } } catch (Exception ex) { ErrorWindow.CreateNew(ex); Debug.WriteLine(string.Format("{0} at {1}", ex.Message, "OOBChecker")); } } /// <summary> /// 安装完成后 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static void Current_InstallStateChanged(object sender, System.EventArgs e) { if (App.Current.InstallState == InstallState.Installed) { IsInstall = true; } } }