Silverlight 客戶端桌面模式(OOB 模式)

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 控件 代碼如下:

  1. <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 屬性就可以知道當前程序使用什麼模式顯示的。

代碼如下:

  1. public MainPage()  
  2.     {  
  3.             InitializeComponent();  
  4.  
  5.             if (Application.Current.IsRunningOutOfBrowser == true)  
  6.             {  
  7.                 //使用桌面模式  
  8.                 this.Txt_Msg.Text = "當前調用的是使用桌面模式";  
  9.             }  
  10.             else 
  11.             {  
  12.                 //使用的遊覽器  
  13.                 this.Txt_Msg.Text = "當前調用的是使用遊覽器模式";  
  14.             }  
  15. }  

第三部:運行結果如下:

 

Silverlight創建安裝桌面程序菜單

 

在用戶的體現中鼠標右鍵在Web程序裏面是一種不友好的方式,所以最好還是在界面中顯示安裝按鈕,之前已將實現了判斷在遊覽器中使用還是在遊覽器中使用。這樣我們就可以顯示和隱藏該安裝按鈕。

第一步:檢查用戶是否有安裝該程序到桌面使用Application.Current.InstallState屬性就可以了;

第二步:安裝方法只要調用 Application.Current.Install() 就可以安裝到用的計算機上;

第三部:用戶需要知道安裝情況,可以註冊 Application.Current.InstallStateChanged 事件來監控安裝情況;

        

完整修改代碼如下:

  1.  /// <summary>  
  2.  /// Silverlight Demo  
  3.  /// </summary>  
  4.  public partial class MainPage : UserControl  
  5.  {  
  6.      public MainPage()  
  7.      {  
  8.          InitializeComponent();  
  9.          this.Btn_Install.Visibility = System.Windows.Visibility.Collapsed;  
  10.          if (Application.Current.IsRunningOutOfBrowser == true)  
  11.          {  
  12.              //使用桌面模式  
  13.              this.Txt_Msg.Text = "當前調用的是使用桌面模式";  
  14.          }  
  15.          else 
  16.          {  
  17.              //使用的遊覽器  
  18.              this.Txt_Msg.Text = "當前調用的是使用遊覽器模式";  
  19.          }  
  20.  
  21.          this.displayInstallState();  
  22.  
  23.          Application.Current.InstallStateChanged += Current_InstallStateChanged;  
  24.      }  
  25.  
  26.      /// <summary>  
  27.      /// 檢查安裝狀態  
  28.      /// </summary>  
  29.      private void displayInstallState()  
  30.      {  
  31.          switch (Application.Current.InstallState)  
  32.          {  
  33.              case InstallState.InstallFailed:  
  34.                  //不能將該應用程序安裝爲在瀏覽器外部運行  
  35.                  this.Txt_Status.Text = "不能將該應用程序安裝爲在瀏覽器外部運行";  
  36.                  break;  
  37.              case InstallState.Installed:  
  38.                  //已經將該應用程序安裝爲在瀏覽器外部運行  
  39.                  this.Txt_Status.Text = "已經將該應用程序安裝爲在瀏覽器外部運行";  
  40.                  break;  
  41.              case InstallState.Installing:  
  42.                  //正在將此應用程序安裝爲在瀏覽器外部運行  
  43.  
  44.                  this.Txt_Status.Text = "正在將此應用程序安裝爲在瀏覽器外部運行";  
  45.                  break;  
  46.              case InstallState.NotInstalled:  
  47.                  //尚未將該應用程序安裝爲在瀏覽器外部運行  
  48.                  this.Txt_Status.Text = "尚未將該應用程序安裝爲在瀏覽器外部運行";  
  49.                  this.Btn_Install.Visibility = System.Windows.Visibility.Visible;  
  50.                  break;  
  51.              default:  
  52.                  break;  
  53.          }  
  54.      }  
  55.  
  56.      //安裝狀態  
  57.      void Current_InstallStateChanged(object sender, EventArgs e)  
  58.      {  
  59.          this.displayInstallState();  
  60.      }  
  61.      //關閉按鈕  
  62.      private void Button_Click_1(object sender, RoutedEventArgs e)  
  63.      {  
  64.          Application.Current.MainWindow.Close();  
  65.      }  
  66.      //安裝按鈕  
  67.      private void Btn_Install_Click(object sender, RoutedEventArgs e)  
  68.      {  
  69.          try 
  70.          {  
  71.              Application.Current.Install();   
  72.          }   
  73.          catch (InvalidOperationException)   
  74.          {   
  75.              MessageBox.Show("應用已經安裝.");   
  76.          }  
  77.  
  78.          catch (Exception)  
  79.          {  
  80.  
  81.              this.Txt_Status.Text = "安裝失敗";  
  82.          }  
  83.           
  84.      }  
  85. }  

 

Silverlight桌面程序自動更新功能

 

現在程序的安裝都完成了還差什麼呢?大家一定猜了就是更新問題,因爲這個也算半個桌面程序那麼如果原程序更改了,客戶端又不知道這樣導致程序用戶的不能正常使用程序了。總不能要用戶每次打開遊覽器去做刪除安裝這個程序吧!現在我們就來解決這個問題。

 

         所需要的方法 Application.Current.CheckAndDownloadUpdateAsync() 當然也有事件可以知道更新的狀態只要註冊Application.Current.CheckAndDownloadUpdateCompleted 事件就可以清楚知道程序更新情況了

 

在界面上添加一個更新按鈕註冊點擊事件內容事件Application.Current.CheckAndDownloadUpdateAsync()

在程序的構造方法中註冊事件 Application.Current.CheckAndDownloadUpdateCompleted  事件中 e.UpdateAvailable 可以知道 更新是否成功;

不過這裡有很糾結的地方就是更新當然需要重啓程序才能算真正的完成可惜在Silverlight程序卻沒有沒有重啓程序的方法不過我想以後微軟會加入這些方法。

代碼如下

 

  1. /// <summary>  
  2. /// Silverlight Demo  
  3. /// </summary>  
  4. public partial class MainPage : UserControl  
  5. {  
  6.     public MainPage()  
  7.     {  
  8.         InitializeComponent();  
  9.         this.Btn_Install.Visibility = System.Windows.Visibility.Collapsed;  
  10.         if (Application.Current.IsRunningOutOfBrowser == true)  
  11.         {  
  12.             //使用桌面模式  
  13.             this.Txt_Msg.Text = "當前調用的是使用桌面模式";  
  14.         }  
  15.         else 
  16.         {  
  17.             //使用的遊覽器  
  18.             this.Txt_Msg.Text = "當前調用的是使用遊覽器模式";  
  19.         }  
  20.  
  21.         this.displayInstallState();  
  22.         Application.Current.CheckAndDownloadUpdateCompleted += Current_CheckAndDownloadUpdateCompleted;  
  23.         Application.Current.InstallStateChanged += Current_InstallStateChanged;  
  24.     }  
  25.     //更新事件  
  26.     void Current_CheckAndDownloadUpdateCompleted(object sender, CheckAndDownloadUpdateCompletedEventArgs e)  
  27.     {  
  28.         if (e.UpdateAvailable == true && e.Error == null)  
  29.         {  
  30.             MessageBox.Show("應用新版本已經下載成功,請重新啓動程序。");  
  31.             Application.Current.MainWindow.Close();  
  32.         }  
  33.         else if (e.UpdateAvailable == false && e.Error == null)  
  34.         {  
  35.             MessageBox.Show("已經是最新版本了。");  
  36.         }  
  37.         else if (e.Error != null)  
  38.         {  
  39.             MessageBox.Show("在檢測應用更新時, 出現以下錯誤信息:" + Environment.NewLine + Environment.NewLine + e.Error.Message);  
  40.         }  
  41.     }  
  42.  
  43.     /// <summary>  
  44.     /// 檢查安裝狀態  
  45.     /// </summary>  
  46.     private void displayInstallState()  
  47.     {  
  48.         switch (Application.Current.InstallState)  
  49.         {  
  50.             case InstallState.InstallFailed:  
  51.                 //不能將該應用程序安裝爲在瀏覽器外部運行  
  52.                 this.Txt_Status.Text = "不能將該應用程序安裝爲在瀏覽器外部運行";  
  53.                 break;  
  54.             case InstallState.Installed:  
  55.                 //已經將該應用程序安裝爲在瀏覽器外部運行  
  56.                 this.Txt_Status.Text = "已經將該應用程序安裝爲在瀏覽器外部運行";  
  57.                 break;  
  58.             case InstallState.Installing:  
  59.                 //正在將此應用程序安裝爲在瀏覽器外部運行  
  60.                 this.Txt_Status.Text = "正在將此應用程序安裝爲在瀏覽器外部運行";  
  61.                 break;  
  62.             case InstallState.NotInstalled:  
  63.                 //尚未將該應用程序安裝爲在瀏覽器外部運行  
  64.                 this.Txt_Status.Text = "尚未將該應用程序安裝爲在瀏覽器外部運行";  
  65.                 this.Btn_Install.Visibility = System.Windows.Visibility.Visible;  
  66.                 break;  
  67.             default:  
  68.                 break;  
  69.         }  
  70.     }  
  71.     //更新  
  72.     private void Button_Click_2(object sender, RoutedEventArgs e)  
  73.     {  
  74.         Application.Current.CheckAndDownloadUpdateAsync();  
  75.     }  
  76.     //安裝狀態  
  77.     void Current_InstallStateChanged(object sender, EventArgs e)  
  78.     {  
  79.         this.displayInstallState();  
  80.     }  
  81.     //關閉按鈕  
  82.     private void Button_Click_1(object sender, RoutedEventArgs e)  
  83.     {  
  84.         Application.Current.MainWindow.Close();  
  85.     }  
  86.     //安裝按鈕  
  87.     private void Btn_Install_Click(object sender, RoutedEventArgs e)  
  88.     {  
  89.         try 
  90.         {  
  91.             Application.Current.Install();  
  92.         }  
  93.         catch (InvalidOperationException)  
  94.         {  
  95.             MessageBox.Show("應用已經安裝.");  
  96.         }  
  97.         catch (Exception)  
  98.         {  
  99.             this.Txt_Status.Text = "安裝失敗";  
  100.         }  
  101.  
  102.     }  
  103. }  

 

運行結果

重新啓動程序

結果版本就一樣了,如果這是後再點擊更新就會出現下圖:

好了現在安裝到更新都有了我們還要為用戶想一下,如果用戶的電腦沒有連接網絡的情況或者使用中斷綫桌面模式獲取服務信息時候就會出現錯誤這個用戶就會覺得你的程序也太差了吧!

解決方法:就是讓程序去檢查是否有網絡存在;

                         我們可以使用 NetworkInterface.GetIsNetworkAvailable() 方法獲取是否在網絡連綫狀態;

當然我們也要註冊監控網絡的事件 NetworkChange.NetworkAddressChanged 來為程序作出更好的用戶體現。

實現代碼:

                     首先添加檢查網絡的方法

  1. //檢查網絡狀態  
  2. private void checkNetworkStatus()  
  3. {  
  4.     if (NetworkInterface.GetIsNetworkAvailable() == true)  
  5.     {  
  6.         this.Txt_NetState.Text = "當前網絡處於連接狀態";  
  7.     }  
  8.     else 
  9.     {  
  10.         this.Txt_NetState.Text = "當前網絡處於離綫狀態";  
  11.     }  

 

          在構造方法中增加

 

  1. this.checkNetworkStatus();  
  2. NetworkChange.NetworkAddressChanged += NetworkChange_NetworkAddressChanged; 

 

 運行查看結果

 

 

本篇教程完畢! 謝謝讀者!

大家可以去下載示例代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章