C# Windows Phone App 開發,自製LockScreen 鎖定畫面類別(Class),從【網路圖片】、【Assets資源】、【UI】修改鎖定畫面。

一般我們在開發Windows Phone App,有時會需要修改鎖定畫面,而鎖定畫面的程式碼又臭又長,若日後還有很多支APP需要使用到這個功能,豈不是要打很多次?所以我們何不創建一個自定義類別,將鎖定畫面的功能寫一次就好了,日後若有其他專案使用到該功能,我們只要引入Class或Dll參考即可。

本篇文章將引導您自製LockScreen 鎖定畫面類別,從【網路圖片】、【Assets資源】、【UI】設定鎖定畫面。

一般我們在開發Windows Phone App,有時會需要修改鎖定畫面,而鎖定畫面的程式碼又臭又長,若日後還有很多支APP需要使用到這個功能,豈不是要打很多次?所以我們何不創建一個自定義類別,將鎖定畫面的功能寫一次就好了,日後若有其他專案使用到該功能,我們只要引入Class或Dll參考即可。

 

本篇文章將引導您自製LockScreen 鎖定畫面類別,從【網路圖片】、【Assets資源】、【UI】設定鎖定畫面。

 

製作修改鎖定畫面的APP必須要先修改【WMAppManifest.xml】

參閱 :

C# Windows Phone App 開發,修改【鎖定畫面】,從【Assets】、【UI】、【網路圖片】,並解決失靈問題。

 

先看如何使用,我們可以透過【Uri】、【WriteableBitmap】、【UIElement】來操作,

Code部分相當的簡短,因為我們透過自定義類別來幫我們完成了,此外也可以保持主程式的畫面整潔 :

 

   1:  //從Assets中的資源設定鎖定畫面
   2:  Uri uri = new Uri("Assets/Tiles/FlipCycleTileLarge.png", UriKind.Relative);
   3:  LockScreen.SetBitmap(uri);
   4:   
   5:  //從網路圖片設定鎖定畫面
   6:  Uri uri_Net = new Uri("http://ppt.cc/vJH3", UriKind.Absolute);
   7:  LockScreen.SetBitmap(uri_Net);
   8:   
   9:  //從UI設定鎖定畫面
  10:  LockScreen.SetBitmap(LayoutRoot);

 

自定義類別如下,說明一併打在程式碼當中,請各位客觀慢用 :

 

   1:  public class LockScreen
   2:  {
   3:      //從Uri設定鎖定畫面
   4:      public async static void SetBitmap(Uri uri ) {
   5:          //若未在WMAppManifest.xml加入Extensions則結束
   6:          if (! await ComfirmDialog()) {
   7:              return;
   8:          }
   9:          //將Uri轉換成Bitmap
  10:          BitmapImage bitmapImage = new BitmapImage();
  11:          bitmapImage.CreateOptions = BitmapCreateOptions.None;
  12:          bitmapImage.UriSource = uri;
  13:          bitmapImage.ImageOpened += (s, e) =>
  14:          {
  15:              //載入完成,必須要等到BitmapImage載入完成才能繼續,否則等於白做
  16:              WriteableBitmap wbm = new WriteableBitmap((BitmapImage)s);
  17:              //將Bitmap轉換成WriteableBitmap
  18:              Uri uri_Net = new Uri(WriteImageToFile(new WriteableBitmap(wbm)), UriKind.Absolute);
  19:              //設定鎖定畫面
  20:              Windows.Phone.System.UserProfile.LockScreen.SetImageUri(uri_Net);
  21:          };
  22:      }
  23:      //從WriteableBitmap設定鎖定畫面
  24:      public async static void SetBitmap(WriteableBitmap writeableBitmap)
  25:      {
  26:          //若未在WMAppManifest.xml加入Extensions則結束
  27:          if (!await ComfirmDialog())
  28:          {
  29:              return;
  30:          }
  31:          Uri uri_UI = new Uri(WriteImageToFile(writeableBitmap), UriKind.Absolute);
  32:          Windows.Phone.System.UserProfile.LockScreen.SetImageUri(uri_UI);
  33:      }
  34:   
  35:      //從UIElement設定鎖定畫面
  36:      public async static void SetBitmap(UIElement uielement)
  37:      {
  38:          //若未在WMAppManifest.xml加入Extensions則結束
  39:          if (!await ComfirmDialog())
  40:          {
  41:              return;
  42:          }
  43:          Uri uri_UI = new Uri(WriteImageToFile(new WriteableBitmap(uielement, null)), UriKind.Absolute);
  44:          Windows.Phone.System.UserProfile.LockScreen.SetImageUri(uri_UI);
  45:      }
  46:   
  47:      //判斷該APP是否已向系統申請修改鎖定畫面,若為False則未在WMAppManifest.xml加入Extensions
  48:      public async static Task<bool> ComfirmDialog(){
  49:          try
  50:          {
  51:              var isProvider = Windows.Phone.System.UserProfile.LockScreenManager.IsProvidedByCurrentApplication;
  52:              //若尚未申請
  53:              if (!isProvider)
  54:              {
  55:                  //跳出視窗詢問使用者,是否授權該APP可以修改鎖定畫面
  56:                  var op = await Windows.Phone.System.UserProfile.LockScreenManager.RequestAccessAsync();
  57:                  isProvider = op == Windows.Phone.System.UserProfile.LockScreenRequestResult.Granted;
  58:              }
  59:              return true;
  60:          }
  61:          catch
  62:          {
  63:              Debug.WriteLine("請在WMAppManifest.xml加入Extensions");
  64:              Debug.WriteLine("參閱 : http://ppt.cc/5U07");
  65:              return false;
  66:          }
  67:      }
  68:   
  69:      //檔案寫入Isolate 回傳 Uri路徑
  70:      private static string WriteImageToFile(WriteableBitmap writeable_bitmap)
  71:      {
  72:          //檔名A
  73:          string FileNameA = "/LockScreen/A.jpg";
  74:          //檔名B
  75:          string FileNameB = "/LockScreen/B.jpg";
  76:          //最後使用的黨名
  77:          string FileName = "";
  78:          try
  79:          {
  80:   
  81:              using (IsolatedStorageFile tStorage = IsolatedStorageFile.GetUserStoreForApplication())
  82:              {
  83:                  //宣告存取IsolatedStorageFile的變數
  84:                  var isolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();
  85:   
  86:                  //若為第一次A、B都不存在
  87:                  if (!isolatedStorage.FileExists(FileNameA) && !isolatedStorage.FileExists(FileNameB))
  88:                  {
  89:                      //使用其中一個當作檔名
  90:                      FileName = FileNameA;
  91:                  }
  92:                  //若A存在則使用B名稱來當作寫入的檔名
  93:                  if (isolatedStorage.FileExists(FileNameA))
  94:                  {
  95:                      //刪除A
  96:                      isolatedStorage.DeleteFile(FileNameA);
  97:                      //使用檔名B
  98:                      FileName = FileNameB;
  99:                  }
 100:                  //若B存在則使用A名稱來當作寫入的檔名
 101:                  if (isolatedStorage.FileExists(FileNameB))
 102:                  {
 103:                      //刪除B
 104:                      isolatedStorage.DeleteFile(FileNameB);
 105:                      //使用檔名A
 106:                      FileName = FileNameA;
 107:                  }
 108:   
 109:                  //在獨立存儲區創建檔案
 110:                  IsolatedStorageFileStream fileStream = isolatedStorage.CreateFile(FileName);
 111:                  //寫入JPG圖檔,品質為100 (越低圖片畫質就越低)
 112:                  writeable_bitmap.SaveJpeg(fileStream, writeable_bitmap.PixelWidth, writeable_bitmap.PixelHeight, 0, 100);
 113:                  //關閉IO
 114:                  fileStream.Close();
 115:                  fileStream.Dispose();
 116:                  tStorage.Dispose();
 117:   
 118:              }
 119:              //重組新的URI,並回傳
 120:              return string.Format("ms-appdata:///local/{0}", FileName);
 121:          }
 122:          catch (Exception ex)
 123:          {
 124:              string tMsg = ex.Message;
 125:              return string.Empty;
 126:          }
 127:      }
 128:   
 129:  }

 

如此一來我們就自製LockScreen 鎖定畫面類別(Class),從【網路圖片】、【Assets資源】、【UI】修改鎖定畫面囉!

 

References :

Suki統整出來的自定義類別

C# Windows Phone App 開發,修改【鎖定畫面】,從【Assets】、【UI】、【網路圖片】,並解決失靈問題。

 

文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝
轉載請註明出處,並且附上本篇文章網址 !  感謝。

SUKI

HOLIESTAR