虽然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;
                }
            }
        }
View Code

相关文章: