Silverlight入门:第七部分 - 脱离浏览器的经验
在本系列的最后一节中,我们准备让应用程序脱离浏览器运行。这会比你想 象的容易很多。
创建清单
在Visual Studio中右击Silverlight应用程序项目,并且选择属性,你将会 看到一个弹出的对话框——注意有关脱离浏览器设置的多选框:
当你点击以后需要完成一些选项:
为你的应用程序设置安装或脱离浏览器运行时的可视化信息是非常重要的。
* 窗体标题——显示在应用程序的窗体标签中
* 宽/高——应用程序启动时的初始宽度和高度
* 快捷方式名称——用于在桌面和开始菜单中显示的名称
* 下载说明——应用程序的说明
* 图标——必须是PNG格式同时还必须在项目中标记为Content在你完成这些配置以后,让我们为你的用户在MainPage.xaml的导航区中添加 一个叫做LinksStackPanel的StackPanel用来当作安装按钮。添加如下XAML:
1 <Rectangle x:Name="Divider3" Style="{StaticResource DividerStyle}"/>
2 <HyperlinkButton x:Name="InstallLink" Style="{StaticResource LinkStyle}"
3 Content="install" Click="InstallOffline"/>
另外在MainPage.xaml.cs中添加离线安装函数:
1 private void InstallOffline(object sender, RoutedEventArgs e)
2 {
3 if (Application.Current.Install())
4 {
5 InstallLink.Visibility = Visibility.Collapsed;
6 }
7 }
安装成功后你将会看到,当不需要安装按钮的时候它会自动隐藏。我们所做 的是让它更加动态,它能自动地隐藏。此外,我们不希望当应用程序脱离浏览器 启动的时候显示安装按钮。幸运的是我们有几个属性可以用:InstallState和 IsRunningOutOfBrowser。让我们来运用它们。
检测InstallState和IsRunningOutOfBrowser
我们准备在MainPage.xaml.cs文件中添加一个事件处理器,以此来检测应用 程序的安装状态以及加载事件处理程序。
1 public MainPage()
2 {
3 InitializeComponent();
4 Loaded += new RoutedEventHandler(MainPage_Loaded);
5 Application.Current.InstallStateChanged += new EventHandler (OnInstallStateChanged);
6 }
在此方法中我们将检查各种状态以决定是否隐藏安装链接:
1 void OnInstallStateChanged(object sender, EventArgs e)
2 {
3 switch (Application.Current.InstallState)
4 {
5 case InstallState.InstallFailed:
6 break;
7 case InstallState.Installed:
8 ToggleInstallLinks(true);
9 break;
10 case InstallState.Installing:
11 break;
12 case InstallState.NotInstalled:
13 ToggleInstallLinks(false);
14 break;
15 default:
16 break;
17 }
18 }
19
20 void ToggleInstallLinks(bool hidden)
21 {
22 InstallLink.Visibility = hidden ? Visibility.Collapsed: Visibility.Visible;
23 Link3.Visibility = hidden ? Visibility.Collapsed : Visibility.Visible;
24 }
我们还要在Loaded事件处理器中检查当前是否运行在脱离浏览器的状态下:
1 void MainPage_Loaded(object sender, RoutedEventArgs e)
2 {
3 if (App.Current.IsRunningOutOfBrowser)
4 {
5 ToggleInstallLinks(true);
6 }
7 else
8 {
9 if (App.Current.InstallState == InstallState.Installed)
10 {
11 ToggleInstallLinks (true);
12 }
13 }
14 }
通过这两个API,我们现在可以自动改变用户界面来隐藏不需要的功能了。检测网络变化
如果应用程序不能访问网络,我们不应该允许搜索,因为它可能无法获取 Twitter搜索API。有一个用于网络接口的API可以使我们检测到网络变化。我们 首先要在MainPage.xaml.cs的构造中添加一个事件处理器:
1 NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(OnNetworkChanged);
这样在网络状态改变的时候就会触发一个事件。现在我们将在 OnNetworkChanged中检查网络是否可用,如果不可用就禁用搜索功能直到它重新 变得可用:
1 void OnNetworkChanged(object sender, EventArgs e)
2 {
3 if (!NetworkInterface.GetIsNetworkAvailable())
4 {
5 // network may not be available, halt searching
6 SearchButton.IsEnabled = false;
7 SearchButton.Content = "DISCONNECTED";
8 _timer.Stop();
9 }
10 else
11 {
12 SearchButton.Content = "SEARCH";
13 SearchButton.IsEnabled = true;
14 _timer.Start();
15 }
16 }
这里只是一个例子,你还可以提供一个UI提示,可以是一个状态条指示器或 别的什么。但对我们的应用程序来说,像上面这样已经足够了。
你可以在这里找到更多关于脱离浏览器经验的内容:
Out-of-browser APIs: http://silverlight.net/learn/videos/silverlight-videos/out-of-browser -experiences
Out-of-browser 安装平台: http://timheuer.com/blog/archive/2009/08/12/silverlight-out-of- browser-force-install-pattern.aspx
脱离浏览器更新
你可能想知道对于安装在机器上的程序如何触发更新。这里有一个API,开发 人员可以通过调用它的CheckAndDownloadUpdateAsync来触发更新模块。更新模 型概述在这里(暂无)。虽然那篇文章用的是不同的API,但是调用的方法和上 面说的是一样的。
总结
我们已经从头构建了一个脱离浏览器的应用程序。我希望一路走下来能对你 有所帮助。把代码下载下来运行一遍并学习其内容。这里还有一些对你有帮助的 资源:
Silverlight 学习视频:http://silverlight.net/learn/
优化你的Silverlight应用程序安装体验: http://timheuer.com/blog/archive/0001/01/01/silverlight-installation- experience-guidance-available-whitepaper-code.aspx
用于提问的论坛:http://forums.silverlight.net/
希望这将能帮助你编写Silverlight应用程序!