Silverlight 很酷的名字,在以前版本 Silverlight 只能承载在Web 上面,由于科技不断的更新现在Silverlight也可以做成桌面版模式去运行,是外观可以更好的给用户体现,还可以调用用户一些公用的软件如 Office 等功能。
本篇学习文章只介绍如何创建一个Silverlight 桌面程序 (OOB模式)。
开发条件:必须是Silverlight 4.0 或以上版本,使用VS 2010 SP1或以上版本。
本篇文章使用的是 VS 2012 和 Silverlight 5.0因为使用VS 2010 SP1 安装上比较麻烦。
第一步:创建项目方案 如图:
这里我把方案和项目名称起名为 SL_Desktop 然后按确定出现下图:
继续确定
这里我们看到了两个项目SL_Desktop 和 SL_Desktop.Web 一个是 Silverlight的界面开发,另外一个承载的Silverlight显示的程序。
第二步:我们就需要设置一下Silverlight 的程序,在SL_Desktop 项目右键属性在Silverlight 选项中看到”允许在游览器外运行应用程序” 上打勾,如图:
然后点击 ”游览器外设置” 按钮,首先设置窗口你想显示的标题名称,设置默认启动后宽度和高度你也可以设置启动后的窗体位置默认居中
设置快捷键名称还可以写上应用程序的说明内容,设置快捷键的图标,图标一共有4种格式
重要的一部,UI的美观度还有需要启动 3D 效果就需要把使用GOD加速勾上。
“显示安装菜单”默认是勾上,这个是在程序的右键可以安装程序到用户机子上,可以按开发者需要来设置
为了运行时的让用户的操作系统对程序的信任度提高我们把“在游览器外运行时需要提升的信任”勾上
最后出现”窗口样式” 选项
-默认值就像: Windows 的文件游览器一样有最小按钮 最大化按钮和关闭按钮;
无边框: 也就没有最小按钮 最大化按钮和关闭按钮和标题栏;
无边圆角框: 在无边框设置使用圆角外观显示,这个选项个人比较喜欢。
设置完成保存,设置界面如下图:
为了显示Silverlight 程序的简单在 MainPage.xaml 添加了一些 文字和按钮如图:
在按钮添加点击事件,用来关闭程序。只要调用 Application.Current.MainWindow.Close(); 就可以了
第三步:运行看到结果如图:
奇怪怎么还是在Web上面显示呢? 别急还有其他步骤的在 Silverlight 右键看到菜单中”将 SL_Desktop 应用程序 安装到此计算机” 点击后,在Windows 的桌面和开始菜单的所有程序都会出现一个快捷方式”SL_Desktop 应用程序”
如果已经安装后怎么卸载呢可以在程序,可以在运行该程序后右键点击程序然后右键会出现”删除该程序应用”就会自动卸载完。
就这么简单程序就可以在 Web 模式 或者 桌面模式下运行
Silverlight 程序中判断用户是使用Web游览器调用还是使用桌面模式调用
第一步:在MainPage.xaml 界面中增加一个TextBlock 控件 代码如下:
- <TextBlock x:Name="Txt_Msg" HorizontalAlignment="Center" Margin="0,60,0,0" TextWrapping="Wrap" VerticalAlignment="Center" FontSize="20" FontWeight="Bold"/>
第二部:在MainPage.xaml.cs 文件的默认构造方法中增加判断后在上面的TextBlock显示结果,判断方法只要使用Application.Current.IsRunningOutOfBrowser 属性就可以知道当前程序使用什么模式显示的。
代码如下:
- public MainPage()
- {
- InitializeComponent();
- if (Application.Current.IsRunningOutOfBrowser == true)
- {
- //使用桌面模式
- this.Txt_Msg.Text = "当前调用的是使用桌面模式";
- }
- else
- {
- //使用的游览器
- this.Txt_Msg.Text = "当前调用的是使用游览器模式";
- }
- }
第三部:运行结果如下:
Silverlight创建安装桌面程序菜单
在用户的体现中鼠标右键在Web程序里面是一种不友好的方式,所以最好还是在界面中显示安装按钮,之前已将实现了判断在游览器中使用还是在游览器中使用。这样我们就可以显示和隐藏该安装按钮。
第一步:检查用户是否有安装该程序到桌面使用Application.Current.InstallState属性就可以了;
第二步:安装方法只要调用 Application.Current.Install() 就可以安装到用的计算机上;
第三部:用户需要知道安装情况,可以注册 Application.Current.InstallStateChanged 事件来监控安装情况;
完整修改代码如下:
- /// <summary>
- /// Silverlight Demo
- /// </summary>
- public partial class MainPage : UserControl
- {
- public MainPage()
- {
- InitializeComponent();
- this.Btn_Install.Visibility = System.Windows.Visibility.Collapsed;
- if (Application.Current.IsRunningOutOfBrowser == true)
- {
- //使用桌面模式
- this.Txt_Msg.Text = "当前调用的是使用桌面模式";
- }
- else
- {
- //使用的游览器
- this.Txt_Msg.Text = "当前调用的是使用游览器模式";
- }
- this.displayInstallState();
- Application.Current.InstallStateChanged += Current_InstallStateChanged;
- }
- /// <summary>
- /// 检查安装状态
- /// </summary>
- private void displayInstallState()
- {
- switch (Application.Current.InstallState)
- {
- case InstallState.InstallFailed:
- //不能将该应用程序安装为在浏览器外部运行
- this.Txt_Status.Text = "不能将该应用程序安装为在浏览器外部运行";
- break;
- case InstallState.Installed:
- //已经将该应用程序安装为在浏览器外部运行
- this.Txt_Status.Text = "已经将该应用程序安装为在浏览器外部运行";
- break;
- case InstallState.Installing:
- //正在将此应用程序安装为在浏览器外部运行
- this.Txt_Status.Text = "正在将此应用程序安装为在浏览器外部运行";
- break;
- case InstallState.NotInstalled:
- //尚未将该应用程序安装为在浏览器外部运行
- this.Txt_Status.Text = "尚未将该应用程序安装为在浏览器外部运行";
- this.Btn_Install.Visibility = System.Windows.Visibility.Visible;
- break;
- default:
- break;
- }
- }
- //安装状态
- void Current_InstallStateChanged(object sender, EventArgs e)
- {
- this.displayInstallState();
- }
- //关闭按钮
- private void Button_Click_1(object sender, RoutedEventArgs e)
- {
- Application.Current.MainWindow.Close();
- }
- //安装按钮
- private void Btn_Install_Click(object sender, RoutedEventArgs e)
- {
- try
- {
- Application.Current.Install();
- }
- catch (InvalidOperationException)
- {
- MessageBox.Show("应用已经安装.");
- }
- catch (Exception)
- {
- this.Txt_Status.Text = "安装失败";
- }
- }
- }
Silverlight桌面程序自动更新功能
现在程序的安装都完成了还差什么呢?大家一定猜了就是更新问题,因为这个也算半个桌面程序那么如果原程序更改了,客户端又不知道这样导致程序用户的不能正常使用程序了。总不能要用户每次打开游览器去做删除安装这个程序吧!现在我们就来解决这个问题。
所需要的方法 Application.Current.CheckAndDownloadUpdateAsync() 当然也有事件可以知道更新的状态只要注册Application.Current.CheckAndDownloadUpdateCompleted 事件就可以清楚知道程序更新情况了
在界面上添加一个更新按钮注册点击事件内容事件Application.Current.CheckAndDownloadUpdateAsync();
在程序的构造方法中注册事件 Application.Current.CheckAndDownloadUpdateCompleted 事件中 e.UpdateAvailable 可以知道 更新是否成功;
不过这里有很纠结的地方就是更新当然需要重启程序才能算真正的完成可惜在Silverlight程序却没有没有重启程序的方法不过我想以后微软会加入这些方法。
代码如下
- /// <summary>
- /// Silverlight Demo
- /// </summary>
- public partial class MainPage : UserControl
- {
- public MainPage()
- {
- InitializeComponent();
- this.Btn_Install.Visibility = System.Windows.Visibility.Collapsed;
- if (Application.Current.IsRunningOutOfBrowser == true)
- {
- //使用桌面模式
- this.Txt_Msg.Text = "当前调用的是使用桌面模式";
- }
- else
- {
- //使用的游览器
- this.Txt_Msg.Text = "当前调用的是使用游览器模式";
- }
- this.displayInstallState();
- Application.Current.CheckAndDownloadUpdateCompleted += Current_CheckAndDownloadUpdateCompleted;
- Application.Current.InstallStateChanged += Current_InstallStateChanged;
- }
- //更新事件
- void Current_CheckAndDownloadUpdateCompleted(object sender, CheckAndDownloadUpdateCompletedEventArgs e)
- {
- if (e.UpdateAvailable == true && e.Error == null)
- {
- MessageBox.Show("应用新版本已经下载成功,请重新启动程序。");
- Application.Current.MainWindow.Close();
- }
- else if (e.UpdateAvailable == false && e.Error == null)
- {
- MessageBox.Show("已经是最新版本了。");
- }
- else if (e.Error != null)
- {
- MessageBox.Show("在检测应用更新时, 出现以下错误信息:" + Environment.NewLine + Environment.NewLine + e.Error.Message);
- }
- }
- /// <summary>
- /// 检查安装状态
- /// </summary>
- private void displayInstallState()
- {
- switch (Application.Current.InstallState)
- {
- case InstallState.InstallFailed:
- //不能将该应用程序安装为在浏览器外部运行
- this.Txt_Status.Text = "不能将该应用程序安装为在浏览器外部运行";
- break;
- case InstallState.Installed:
- //已经将该应用程序安装为在浏览器外部运行
- this.Txt_Status.Text = "已经将该应用程序安装为在浏览器外部运行";
- break;
- case InstallState.Installing:
- //正在将此应用程序安装为在浏览器外部运行
- this.Txt_Status.Text = "正在将此应用程序安装为在浏览器外部运行";
- break;
- case InstallState.NotInstalled:
- //尚未将该应用程序安装为在浏览器外部运行
- this.Txt_Status.Text = "尚未将该应用程序安装为在浏览器外部运行";
- this.Btn_Install.Visibility = System.Windows.Visibility.Visible;
- break;
- default:
- break;
- }
- }
- //更新
- private void Button_Click_2(object sender, RoutedEventArgs e)
- {
- Application.Current.CheckAndDownloadUpdateAsync();
- }
- //安装状态
- void Current_InstallStateChanged(object sender, EventArgs e)
- {
- this.displayInstallState();
- }
- //关闭按钮
- private void Button_Click_1(object sender, RoutedEventArgs e)
- {
- Application.Current.MainWindow.Close();
- }
- //安装按钮
- private void Btn_Install_Click(object sender, RoutedEventArgs e)
- {
- try
- {
- Application.Current.Install();
- }
- catch (InvalidOperationException)
- {
- MessageBox.Show("应用已经安装.");
- }
- catch (Exception)
- {
- this.Txt_Status.Text = "安装失败";
- }
- }
- }
运行结果
重新启动程序
结果版本就一样了,如果这是后再点击更新就会出现下图:
好了现在安装到更新都有了我们还要为用户想一下,如果用户的电脑没有连接网络的情况或者使用中断线桌面模式获取服务信息时候就会出现错误这个用户就会觉得你的程序也太差了吧!
解决方法:就是让程序去检查是否有网络存在;
我们可以使用 NetworkInterface.GetIsNetworkAvailable() 方法获取是否在网络连线状态;
当然我们也要注册监控网络的事件 NetworkChange.NetworkAddressChanged 来为程序作出更好的用户体现。
实现代码:
首先添加检查网络的方法
- //检查网络状态
- private void checkNetworkStatus()
- {
- if (NetworkInterface.GetIsNetworkAvailable() == true)
- {
- this.Txt_NetState.Text = "当前网络处于连接状态";
- }
- else
- {
- this.Txt_NetState.Text = "当前网络处于离线状态";
- }
- }
在构造方法中增加
- this.checkNetworkStatus();
- NetworkChange.NetworkAddressChanged += NetworkChange_NetworkAddressChanged;
运行查看结果
本篇教程完毕! 谢谢读者!
大家可以去下载示例代码。