本文章是由機器翻譯。

資料點

建置一個 Out-Of-瀏覽器用戶端,使用 Silverlight 3

John Papa

本文根據 Silverlight 3 的運算式 Blend 的搶鮮版而定。

可從 MSDN 程式庫 的程式碼下載
瀏覽線上的程式碼

內容

On TheTarget 的雙眼
安裝至桌面
資訊清單的基本資訊
執行離線
網路連線
離線儲存資料

Silverlight 3 的應用程式已不再限於在瀏覽器中執行。它們可以在瀏覽器,或它們可以被中斷連結,從瀏覽器,並從桌上型電腦執行中執行。這些 Out-of-瀏覽器應用程式可讓您將直接到沒有限制的瀏覽器內執行桌面上的 Silverlight 3 應用程式,豐富性。

在本月的專欄中,我會討論如何建置資料導向獨立 Silverlight 3 的應用程式。我會先示範範例應用程式的概觀。接下來,我將概述採取應用程式,並讓它使用外部瀏覽器的必要步驟。正在從瀏覽器的需要一些額外的功能,例如偵測連線的能力。我將討論如何偵測到離線應用程式的狀態,以及處理在中斷網路連線時,請儲存離線資料的如何。我將討論方式以及其他功能建置到 Out-of-瀏覽器應用程式使用隔離儲存區存放資料,在用戶端電腦顯示的 Out-of-瀏覽器應用程式,狀態,並在處理狀態變更事件的圖示。範例應用程式將是您,Twitter-類似用戶端傳送,訊息中擷取 Twitter 伺服器的輕量型版本。所有範例都包含在這個月的程式碼下載中。

On TheTarget 的雙眼

到 Out-of-瀏覽器功能的投擲之前, 很重要,瞭解哪些功能,我使用建置本文中的範例應用程式,讓我們開頭概觀。範例應用程式將示範您,如何建置資料導向應用程式使用 Silverlight 3 和其 Out-of-瀏覽器的功能。範例應用程式的目標是建立 Twitter 用戶端可傳送新郵件和擷取使用者的朋友時刻表、 回覆和直接的訊息。雖然下列這裡我將討論這些模型可以加入更多功能,它就會是簡單的輕量型 Twitter,用戶端的版本。[圖 1 ] 顯示範例應用程式的瀏覽器的不足。

fig01.gif

[圖 1] 簡介 Silverlight Twitter 的用戶端

按一下 [首頁] 按鈕時,是下列在 SilverTwit 應用程式會要求,並顯示使用者的任何人的郵件。按一下 [回覆] 和 [Direct] 按鈕,回覆給登入的使用者] 和 [給登入的使用者直接訊息會擷取並顯示,分別。要求訊息就會加入從 Silverlight 跨瀏覽器應用程式至 Web 服務 (也包含在範例專案中),然後 Web 服務會轉送到公用Twitter API 要求。這個轉接,透過協力廠商服務是因為 Twitter 不允許進行從 Web 用戶端以 Twitter 直接的跨網域通訊。不過,Twitter 不會讓從伺服器應用程式 (例如範例方案中所使用的呼叫。其他替代方案是使用 PopFly 或 Yahoo 的管道,以轉送要求。

如需跨網域原則的詳細資訊,請參閱我 9 月 2008 資料點] 資料行。該的資料行中的我會討論檔案格式] 和 [原則的運作方式。

當使用者輸入訊息,並按一下 [內容] 按鈕時,轉送 Twitter 上的 Web 服務的方式就會傳送郵件。如果應用程式無法偵測網路連線,且使用者嘗試將郵件張貼,訊息會儲存在本機直到可以還原網路連線。此時將延後的訊息會傳送到 Twitter]。

請注意如 [圖 1 ] 所示的範例應用程式周圍色彩會包含應用程式圖示 」、 「 應用程式的標題中和 「 標準的最小化,最大化,],並關閉圖示。您正在建置 Visual Studio 或運算式 Blend 中的應用程式時,可以自訂標題和用於視窗、 的桌面和其他方面的應用程式的圖示。這個視窗就會啟動使用 sllauncher.exe 處理序及其主應用程式,Silverlight 3 Out-of-瀏覽器應用程式。

SilverTwit 範例應用程式的底端會包含統計資料是否在網路連線偵測或不,如果應用程式執行中] 或 [超出資料的瀏覽及應用程式是否已卸離。所有這些功能可以協助識別它應該作業 Out-of-瀏覽器應用程式。例如,如果無法偵測到網路連線有是尋找新的郵件,或將新的訊息傳送到 Twitter 沒有理由。在這種中斷連接的網路狀態,應用程式必須適當回應。detach 按鈕也會存在於較低的應用程式將會中斷連結的應用程式以外的瀏覽器所執行的區段中。

安裝至桌面

Silverlight 2 應用程式的限制來在瀏覽器內執行大小寫。但是 Silverlight 3 的應用程式可以執行在瀏覽器或 out。出的瀏覽器應用程式的程序則是稱為 「 中斷]。 一旦已卸離 Silverlight 3 應用程式可以從 [開始] 功能表或桌面的圖示執行它。Out-of-瀏覽器的應用程式針對桌上型電腦主控視窗 sllauncher.exe 處理程序執行。Out-of-瀏覽器應用程式仍然可以存取網路,並中斷連結時,請使用 Silverlight 可用.NET Framework 程式庫的所有。有 Out-of-瀏覽器應用程式的一些限制。例如,因為無法裝載在瀏覽器中,與瀏覽器的 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 也讓使用者和 / 到桌上型電腦或 Out-of-瀏覽器應用程式 [開始] 功能表新增捷徑的選擇。 一旦使用者按一下 [確定],應用程式會安裝在桌上型電腦上,並開始啟動 (sllauncher.exe 處理序所裝載)。 這時候會關閉瀏覽器,可以,而且會跨瀏覽器應用程式繼續執行在它自己。

以滑鼠右鍵按一下在 Out-of-瀏覽器應用程式,然後從快顯功能表中選擇移除應用程式,可以移除應用程式。 這可以從 Out-of-瀏覽器應用程式,或從相同瀏覽器中執行的版本完成。 一旦移除,桌面的圖示和 [開始] 功能表項目都會同時移除。 值得注意的是 Out-of-瀏覽器的應用程式才會顯示在控制台的 [新增 / 移除程式] 清單中。

資訊清單的基本資訊

離線應用程式,是簡單的程序,使用者和幾乎為簡單從開發的觀點來看。 Silverlight 3 Beta 版會需要一些簡單變更到 Silverlight 專案中的 appmanifest.xml 檔案可讓它所要採取的瀏覽器。 如果不進行這些變更,然後 Silverlight 應用程式無法被卸離及執行的瀏覽器。 在 AppManifest.xml 位於 [屬性] 資料夾依預設,它可以加入 Out-of-瀏覽器功能以手動方式編輯。

[圖 4 顯示 [AppManifest.xml 檔案從範例應用程式,以在感興趣的項目將新 Deployment.ApplicationIdentity 一節中的粗體顯示。 [ShortName Out-of-瀏覽器應用程式 (在 [開始] 功能表和桌面捷徑) 使用的快速鍵。 標題會顯示 Out-of-瀏覽器應用程式的標題列中。 圖示是選擇性 ; 但是,是所有圖示必須是包含或都包含。 在最終版本的 Silverlight 3,變更這項需求,可能會中,但在的 Beta,Out-of-瀏覽器會無法正常運作如果指定一些圖示和其他不。 不同的圖示用於 [開始] 功能表快速鍵、 桌上型電腦圖示的快速鍵、 在 Out-of-瀏覽器應用程式,] 和 [在對話方塊,提示使用者,以決定是否要安裝應用程式外部瀏覽器的視窗] 的圖示。

在 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 屬性。 這個屬性會傳回布林 (Boolean) 值,指出 Silverlight 應用程式是否執行線上,(在瀏覽器),或 (超出瀏覽器) 的離線。 這會很有用,知道特別時您可能要執行通訊的程式碼與瀏覽器的 DOM 的 Silverlight。 如果您正在執行線上,應用程式可以會與瀏覽器的 DOM。 中通訊 不過,如果您執行離線,應用程式裝載在 sllauncher.exe 處理序,並沒有在 DOM (因為它不是在瀏覽器)。 因此,執行這個程式碼之前,您無法檢查 RunningOffline 屬性。

當 Out-of-瀏覽器應用程式第一次執行時,它就會永遠開啟到預設的大小。 一旦開啟,視窗可以被調整大小、 最大化、 最小化,或關閉。 開始的大小和控制項本身的視窗不是目前功能 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 detach 事件。

為辨識在同時 (執行離線) 的 [圖 1 ] 和 [ 圖 6 (執行線上) 中,應用程式的較低的部分顯示目前的狀態為 Detached 因為應用程式中斷的連結。 事件變更,應用程式中的郵件會自動更新本身使用資料繫結。

如需資料繫結,在 Silverlight 的詳細資訊,請參閱我 9 月 2008 資料點] 資料行 (」 使用 Silverlight 2 的服務導向應用程式和 WCF"). 在該的資料行,我討論資料繫結和繫結模式。

事件處理常式可以設定要接聽這些狀態的處理 ExecutionStateChanged 事件,如下所示:

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

當 ExecutionStateChanged 事件引發時,具有狀態的 DetachUpdatesAvailable 時,Silverlight 3 Out-of-瀏覽器應用程式偵測可以下載較新版本 Silverlight 3 應用程式。 使用者然後可以關閉 Out-of-瀏覽器應用程式,並重新開啟它自動接收更新。 [圖 7 ] 顯示 ExecutionStateChanged 事件引發時已顯示 Out-of-瀏覽器應用程式中的訊息。

fig05.gif

[圖 7 更新可用

網路連線

但另一個新功能,Silverlight 3 的也將就是您它可以偵測網路連線是否可用的這得歸功 NetworkInterface.GetIsNetworkAvailable() 方法在 System.Net 命名空間中。 這個檢查是必要的當執行 Web 服務必須進行通訊的 Out-of-瀏覽器應用程式。 如果網路連線停止運作應用程式可以執行其他可行方案。 通知問題的使用者或可能儲存資料在本機直到變成可用的網路連線,可能包括一些因應措施。

當它偵測到網路的位址變更時,執行 NetworkChange.NetworkAddressChanged 事件 (也 System.Net.NetworkInformation 類別的一部分)。 可以處理這個事件,如下所示:

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

[圖 8 ] 中的程式碼會顯示 NetworkAddressChange 事件,事件處理常式。 程式碼會先設定 IsNetworkAvailable 繫結至 Silverlight UI,並顯示使用者的網路連線狀態的布林 (Boolean) 的狀態屬性。 圖 9 ] 顯示 Out-of-瀏覽器應用程式偵測網路位址已遺失。 繫結更新訊息和狀態色彩紅色。 在最簡單測試這就是開啟您的網路連線對話方塊來停用所有的網路連線。 這會造成 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 的隔離儲存區的詳細資訊,請參閱我的二月 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);
}

Out-of-瀏覽器的應用程式會自動取得 25MB 的隔離儲存區 (Isolated Storage) 中的可用空間。線上的瀏覽器的主控 Silverlight 應用程式會取得儲存區的 1 MB。其他的儲存都可以透過 IsolatedStorageFile.IncreaseQuoteTo API,將會提示使用者允許或拒絕配額增加的要求。

如果在隔離儲存區中沒有訊息會儲存使用者的新郵件,並在使用者通知訊息會傳送時重新建立網路連線。時重新建立網路位址,NetworkAddressChanged 事件處理常式會執行並會提取出的隔離儲存區訊息並送出 (如 [圖 8 ] 所示)。

如您所見,Silverlight 3 的 Out-of-瀏覽器的解決方案就會允許在桌上型電腦瀏覽器而不需要透過網路的連線上執行 Silverlight 應用程式。它具有.配管,來偵測網路連線以採取網路事件發生的動作,如果需要,在本機儲存資料。您不妨試一試。您確定撰寫一些很棒使用這些新功能!

您提出問題或意見,請將 John 寄mmdata@Microsoft.com.

John Papa (johnpapa。net) 是 ASPSOFT 與棒球的愛好者為資深顧問,人員花與他的家人 Kadi 的夏天住宿。John、 C# MVP,Silverlight Insider 和 INETA 的喇叭已撰寫包括他最新標題的 Data-Driven Services with Silverlight 2 (O ' Reilly,2009) 幾本書籍。將說出而他通常呈在混合、 DevConnections,和 VSLive 的會議。