一般我們在開發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】、【網路圖片】,並解決失靈問題。
文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝
轉載請註明出處,並且附上本篇文章網址 ! 感謝。