数据点

使用 Silverlight 3 构建脱离浏览器运行的客户端

John Papa

本文基于 Silverlight 3 和 Expression Blend 的预发布版本。

代码下载可从 MSDN 代码库
浏览代码联机

内容

TheTarget 的眼睛
安装到桌面
清单精要
运行脱机
网络连接
脱机存储数据

Silverlight 3 应用程序不再仅限于一个浏览器中运行。它们可以运行在浏览器或它可以从浏览器的分离和从桌面运行。这些浏览器外应用程序允许您将丰富的 Silverlight 3 应用程序直接到桌面而无任何浏览器中运行的限制。

在本月的专栏中,我将讨论如何构建数据驱动的独立 Silverlight 3 应用程序。我将首先演示示例应用程序的概述。接下来,我将概述使该应用程序,并使其使用浏览器所需此步骤。在浏览器出的需要一些其他功能能够检测到连接。我将讨论如何检测的脱机应用程序状态和如何处理当在中断网络连接存储数据脱机。我将讨论方式以及其他功能到浏览器外应用程序使用独立的存储显示外浏览器应用程序的状态,并处理状态更改事件在客户端计算机上存储数据生成图标。示例应用程序是 Twitter 类似于客户端发送和从 Twitter 服务器中检索邮件的轻型版本。本月的代码下载包括所有示例。

TheTarget 的眼睛

浏览器外功能的深入之前, 很重要了解我将使用生成本文中的示例应用程序,因此让我们开头概述哪些功能。示例应用程序演示如何构建数据驱动应用程序与 Silverlight 3 和其外浏览器功能。示例应用程序的目标是创建 Twitter 客户端允许发送新邮件和检索用户的朋友时间线、 答复,和直接的消息。未能执行此处,我将讨论的模型添加许多更多的功能一样,它是简单、 轻量的版本,Twitter 客户端。图 1 显示了示例应用程序浏览器不足。

fig01.gif

图 1 Silverlight Twitter Client 概览

单击开始按钮时,是执行的 SilverTwit 应用程序将请求并显示来自所有人的用户。答复和直接按钮被单击时, 被检索并显示,分别对登录用户的答复和直接邮件登录的用户。邮件的请求,从 Silverlight 外浏览器应用程序到 Web 服务 (也包含在示例项目中) 并 Web 服务然后中继请求到公共 Twitter API。需要通过第三方服务此中继,因为 Twitter 不允许与可从 Web 客户端 Twitter 直接的跨域通信。但是,Twitter 允许从服务器应用程序 (如该示例解决方案中使用的调用。其他方法是进行中继请求使用 PopFly 或 Yahoo 的管道。

有关跨域策略的详细信息,请引用我 2008 年 9 数据点列。该列中, 我将讨论文件格式和策略的工作方式。

当用户输入一条消息,并单击发布按钮时,该邮件将被发送通过中继 Twitter 上的 Web 服务的方式。如果应用程序无法检测网络连接,而用户尝试发布邮件,邮件将存储本地之前可以还原网络连接。此时将被延迟的邮件发送到 Twitter。

注意, 图 1 所示的示例应用程序周围镶边包含应用程序图标、 应用程序的标题,和标准的最小化最大化,关闭图标。可以自定义标题和用于窗口、 在的桌面和应用程序的其他方面的图标,在生成 Visual Studio 或表达式 Blend 中的应用程序时。此窗口会启动使用 sllauncher.exe 过程和其主机 Silverlight 3 外浏览器应用程序。

SilverTwit 示例应用程序的底部包含是否网络连接检测是否,如果应用程序正在运行中或超出浏览器,并且应用程序是否已分离的统计信息。所有这些功能有助于确定应运行方式外浏览器应用程序。是例如如果网络连接没有检测到没有理由查找新邮件,或将新邮件发送到 Twitter。作出处于此断开连接的网络状态时应用程序必须反应相应。在应用程序将取消应用程序之外的浏览器的下半部分中还存在一个分离按钮。

安装到桌面

Silverlight 2 应用程序被限制在浏览器内运行。但是 Silverlight 3 应用程序可以运行在浏览器或缩小。出的浏览器应用程序的过程称为"分离。 一旦已分离 Silverlight 3 应用程序,它运行从开始菜单或从桌面图标。浏览器外应用程序从 sllauncher.exe 进程运行窗口中承载的在桌面上。浏览器外应用程序仍然可以访问网络,和分离时,请使用.NET Framework 库可用于 Silverlight 的所有。有几个限制的浏览器外应用程序。例如,它们不驻留在浏览器中,因为与浏览器的 DOM 通信是不可能像它们是与浏览器中承载的 Silverlight 应用程序。

图 2 概述了如何在浏览器中运行一个 Silverlight 3 应用程序,并再分离。单击分离按钮运行显示 图 2 ,最终运行 Application.Current Detach() 方法的事件处理程序。图 3 显示了体系结构。application.current.Detach 方法将引发异常如果它不能分离因此一些错误处理是一个不错的主意。

图 2 的分离从浏览器

private void DetachButton_Click(object sender, RoutedEventArgs e)
{
    try {
        Application.Current.Detach(); // take the app out of browser
    }
    catch (InvalidOperationException opex)    {
        MessageBox.Show("Application is already detached" +
          " to the desktop.");
    }
    catch (Exception ex)    {
        MessageBox.Show("Application could not be detached" +
          " to the desktop."+ Environment.NewLine + 
          ex.Message);
    }
}

fig03.gif

图 3 分离浏览器外部运行一个 Silverlight 应用程序

然后用户可以决定它们是否确定他们要分离从浏览器应用程序。 Silverlight 也使用户到桌面和/或到浏览器外应用程序的开始菜单添加快捷方式的选项。 一旦用户单击确定,应用程序将在桌面上安装,并且开始启动 (由 sllauncher.exe 过程)。 到目前为止在浏览器可以被关闭 ; 而且外浏览器应用程序继续运行在它自己。

右键单击浏览器外应用程序并从弹出菜单中选择应用程序可以删除该应用程序。 这可以从该浏览器外应用程序或从浏览器中运行同一版本。 一旦删除,桌面图标和开始菜单项将同时删除。 值得注意的浏览器外应用程序将不显示在控制面板的添加/删除程序列表。

清单精要

使应用程序脱机是一个简单的过程,对于用户和几乎为简单从开发的角度来看。 Silverlight 3 Beta 需要进行在 Silverlight 项目 appmanifest.xml 文件,使其可以在终止浏览器的几个简单更改。 如果进行,这些更改也不会是然后 Silverlight 应用程序不能被分离并运行出的浏览器。 在 AppManifest.xml 位于属性文件夹中默认情况下,它可以将浏览器外功能手动编辑。

图 4 显示了在 AppManifest.xml 文件示例应用程序中的目标项目粗体显示新的 Deployment.ApplicationIdentity 节中。 在 ShortName 快捷方式中用于浏览器外应用程序 (在开始菜单和桌面快捷方式) 代表。 标题显示在浏览器外应用程序的标题栏。 图标是可选 ; 但是,所有图标必须包含或没有包含。 此要求可能会更改为 Silverlight 3,最终版本中,但在测试版,在外浏览器将无法正常运行如果指定一些图标和不是其他。 各种图标用于开始菜单快捷方式、 桌面图标快捷方式、 窗口在浏览器外应用程序和对话框,提示用户决定是否要安装外部浏览器应用程序中的图标。

该 AppManifest.xml 的图 4 设置

<Deployment xmlns="https://schemas.microsoft.com/client/2007/deployment"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        EntryPointAssembly="SilverTwit"    
        EntryPointType="SilverTwit.App">   
  <Deployment.Parts>
    </Deployment.Parts>
  <Deployment.ApplicationIdentity>
    <ApplicationIdentity
         ShortName="SilverTwit"
         Title="SilverTwit - Silverlight Twitter Client">
      <ApplicationIdentity.Blurb>Tweet, tweet and retweet</ApplicationIdentity.Blurb>
      <ApplicationIdentity.Icons>
        <Icon Size="16x16">images/SilverTwit16.png</Icon>
        <Icon Size="32x32">images/SilverTwit32.png</Icon>
        <Icon Size="48x48">images/SilverTwit48.png</Icon>
        <Icon Size="128x128">images/SilverTwit128.png</Icon>
      </ApplicationIdentity.Icons>
    </ApplicationIdentity>
  </Deployment.ApplicationIdentity>
</Deployment>

运行脱机

另一个添加到 Silverlight 3 的新功能是 application.current.RunningOffline 属性。 此属性返回一个指示 Silverlight 应用程序是运行联机 (在浏览器) 还是脱机 (个浏览器) 的 Boolean 值。 这是很有用知道尤其是当您可能希望运行通信的代码使用浏览器的 DOM 从 Silverlight 的。 如果您运行联机,应用程序可以与浏览器的 DOM。 通信 但是,如果在运行脱机,应用程序位于 sllauncher.exe 过程中,但没有 DOM (因为它不是在浏览器)。 因此,运行此代码之前,您可以检查 RunningOffline 属性。

当浏览器外应用程序首次运行时始终打开与默认大小。 一旦打开,窗口可以是调整大小、 最大化、 最小化,或关闭。 开始的大小和控制窗口本身不是当前 Silverlight 3 Beta 中的功能。

图 1 所示的示例应用程序运行在浏览器之外。 这被示下半部分窗口,它指出"出的浏览器的运行"。 完成此项检查使用 图 5 所示的代码。 如果应用程序已在浏览器中运行的邮件将阅读运行"在浏览器如 图 6 的应用程序运行在浏览器中所示。

图 5 联机或脱机吗?

private void SetOfflineStatus()
{
    if (Application.Current.RunningOffline)
        stats.RunningModeMessage = "Running Out of Browser";
    else
        stats.RunningModeMessage = "Running In Browser";
}

fig04.gif

图 6 运行联机

Silverlight 3 的另一个新功能是事件 (ExecutionStateChanged) 将通知的应用程序是在应用程序的执行状态更改时。 有五个不同的州 (位于 ExecutionStates 枚举器) 可能会导致出现这种情况:

  • RunningOnline – 在浏览器中正在运行该应用程序。
  • 分离-从浏览器中分离应用程序。
  • 分离-应用程序现在分离从浏览器和浏览器外部运行。
  • 分离,相同,但它 DetachedUpdatesAvailable – 看到更新可用。
  • DetachedFailed – 失败 A 分离事件。

如所 图 1 (运行脱机) 和 图 6 (运行联机) 中,应用程序的下半部分会显示为 Detached 由于已分离应用程序当前状态。 事件更改,应用程序中的邮件会自动更新自身使用数据绑定。

有关在 Silverlight 中的数据绑定的详细信息,请参考我 2008 年 9 数据点列 (" 使用 Silverlight 2 驱动服务的应用程序和 WCF"). 该列中, 我将讨论数据绑定和绑定模式。

事件处理程序可以设置为侦听这些状态通过处理该 ExecutionStateChanged 事件,如下所示:

Application.Current.ExecutionStateChanged += new EventHandler(Network_ExecutionStateChanged);

ExecutionStateChanged 事件触发的 DetachUpdatesAvailable 状态时, Silverlight 3 外浏览器应用程序已检测到可以下载较新版本的 Silverlight 3 应用程序。 然后,用户可以关闭浏览器外应用程序,并重新打开它能自动接收更新。 图 7 显示了 ExecutionStateChanged 事件触发时,显示在浏览器外应用程序中的邮件。

fig05.gif

图 7 更新可用

网络连接

还的 Silverlight 3 的其他新功能就是它可以检测网络连接是否可用,Thanks NetworkInterface.GetIsNetworkAvailable() 方法 System.Net 命名空间中。 使用 Web 服务运行必须进行通信的浏览器外应用程序时,此检查至关重要。 如果在网络连接已断开,应用程序可以执行一种替代方法。 一些替代方法可能包括通知此问题的用户,或可能直到网络连接可用本地存储数据。

检测到网络地址更改时,将执行 NetworkChange.NetworkAddressChanged 事件 (也的 System.Net.NetworkInformation 类的一部分)。 此事件可以进行处理,如下所示:

NetworkChange.NetworkAddressChanged += 
  new NetworkAddressChangedEventHandler(NetworkChange_  NetworkAddressChanged);

图 8 中的代码演示在事件事件处理程序在 NetworkAddressChange。 代码首先绑定到 Silverlight UI 并显示网络连接的状态的用户的 IsNetworkAvailable 一个 Boolean 类型的值的状态属性设置。 图 9 显示了浏览器外应用程序已检测到网络地址已丢失。 绑定更新为红色的消息和状态颜色。 若要测试此,最简单方法是打开您网络连接对话框,并禁用所有网络连接。 这将导致 NetworkAddressChanged 事件触发,该 UI 更新通过数据绑定事件。

图 8 检测网络地址的更改

private void NetworkChange_NetworkAddressChanged(object sender, EventArgs e)
{
    stats.IsNetworkAvailable = NetworkInterface.GetIsNetworkAvailable();

    if  (NetworkInterface.GetIsNetworkAvailable())
    {
        // get the stored tweet, try to post it
        if (IsolatedStorageSettings.ApplicationSettings.Contains(TWEET_STORAGE))
        {
            PostTweet(IsolatedStorageSettings.ApplicationSettings[TWEET_STORAGE].ToString());
        }
    }
}

fig09.gif

图 9 网络地址不可用

应用程序正在运行,并且网络连接已丢失时, 用户仍然可能希望将邮件张贴到 Twitter。 (请记住,尽管网络连接可能活动,Twitter 服务可能已断开。 一种方法确定是否正在运行 Twitter 是如何对其进行 ping 测试)。 示例应用程序允许用户将仍然,条消息,但因为它无法被发送到立即 Twitter,邮件存储在独立存储区 (Silverlight 的本地持久性存储)。 图 8 显示了检测网络更改到,如果网络就成为可用,并且在独立存储中没有邮件,邮件将过帐到 Twitter。

有关在 Silverlight 中的独立存储的详细信息,请参考我 2 月 2009 数据点列" 联合的数据和在 Silverlight 的独立的存储."

脱机存储数据

如果应用程序无法检测网络地址,而用户尝试发布消息,数据可以存储在独立存储中。 示例应用程序允许将存储一次只有一个消息 ; 但是,此可能会增加通过单独或 XML 内存储每封邮件。 图 10 显示了检查网络是否可用的代码。 如果有可用,是发送消息到 Twitter。 如果没有通过托盘运输,代码检查有已邮件独立存储中。 如果不存在则用户将通知只有一个邮件可存储一次。

图 10 到 Twitter 发送邮件

private void PostTweet()
{
    string tweetText = TweetTextBox.Text;
    if (!NetworkInterface.GetIsNetworkAvailable())
    {
        if (IsolatedStorageSettings.ApplicationSettings.Contains(TWEET_STORAGE))
        {
            MessageBox.Show(
                "Network connection is not available and only 1 tweet" + 
                " can be stored for delayed posting to Twitter.");
        }
        else
        {
            IsolatedStorageSettings.ApplicationSettings.Add(TWEET_STORAGE, tweetText);
            MessageBox.Show(
                "Network connection is not available. The post" +
                " will be stored until connectivity returns.");
        }
        return;
    }

    PostTweet(tweetText);
}

浏览器外应用程序自动获取 25MB 独立存储中可用的空间。在线托管浏览器的 Silverlight 应用程序获得的存储的 1MB。可以通过 IsolatedStorageFile.IncreaseQuoteTo API 将提示用户允许或拒绝配额增加请求额外的存储。

如果独立存储中有无消息,存储用户的新邮件,并通知用户已重新建立网络连接时将发送该邮件。当网络地址重新建立时,NetworkAddressChanged 事件处理程序将运行并将提取邮件独立存储并提交 (如 图 8 中所示)。

正如您所看到的 Silverlight 3 浏览器外解决方案将允许 Silverlight 应用程序在桌面上不在浏览器并且在不必使用网络连接的情况下运行。它具有以检测网络连接网络事件发生时, 采取措施并本地存储数据,如果需要管道。试一试吧。您确定给这些新功能的一些很好的用途 !

将您的问题和意见发送 John 到mmdata@Microsoft.com.

John Papa (johnpapa。net) 是一个高级顾问 ASPSOFT 和棒球风扇花费在大多数时光都其家人的夏天整夜的。John、 C# MVP,Silverlight Insider,以及 INETA 演讲者已编写几部著作,包括其最新标题为的 Data-Driven Services with Silverlight 2 (O ' Reilly,2009)。他经常讲述在如组合、 DevConnections 和 VSLive 的会议。