Windows Phone 7 – SystemTray與ProgressIndicator
這一篇內容主要介紹一個大家撰寫App時第一件會做的事,「隱藏畫面最上方的系統軸」;
在Android或iOS裡,只有在遊戲模戲下,才能隱藏系統軸,其餘最多只能隱藏顯示應用程式的標題列。
但我在猜想:「是否由於iOS/Android可由頂端往下拉出通知範圍,所以不能隱藏系統軸?」,也許未來
WP也支援類似的功能後,系統軸隱藏的功能也不能了,但這只是猜測,先讓我們來看看怎麼實作吧。
屬於Microsoft.Phone.Shell Namespace裡的類別,主要任務為提供Application Page上System Tray的方法與屬性。
幾個要注意的屬性與方法:
方法/屬性 | 說明 |
CheckAccess | 用於確定呼叫該屬性的Thread是否有存取該物件的能力。 CheckAccess是個Utility方法, true:代表呼叫的Thread與要操作的DependencyObject屬於相同的Thread; false:代表建立該DependencyObject的Thread與呼叫的Thread不相同; 如果是false則會出現Exception要特別注意。 |
GetProgressIndicator | 取得Application Page中的ProgressIndicator的物件/屬性。 |
SetProgressIndicator | 設定Application Page中的ProgressIndicator的物件/屬性。 |
往下繼續說明怎麼操作SystemTray。
a. 開啟/關閉System Tray:
1: //記得using Microsoft.Phone.Shell namespace
2:
3: private void ChangeSystemTray(bool pVisible)
4: {
5: // true: 顯示; false: 隱藏;
6: SystemTray.IsVisible = pVisible;
7: }
b. 在System Tray裡得到那些Status Icons呢?根據<W17: Windows Phone 7 System Tray>的介紹,包括如下圖:
該類別用意在提供每個Application Page上的System Tray有一個互動的progress indicator。WP 7.1 SDK新增加的,
以前在WP 7.0 SDK裡沒有這個類別,所以如果程式裡需要做到背景執行的任務時,通常會popup一個Progressbar,
讓使用者知道目前正在處理交易,請他們等待。那麼,要如何使用它呢?
a. 使用Code建立ProgressIndicator:
1: private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
2: {
3: //需要確實把SystemTray.IsVisible = true,ProgressIndicator才能顯示
4: Microsoft.Phone.Shell.SystemTray.IsVisible = true;
5:
6: //建立一個新的ProgressIndicator
7: ProgressIndicator tProgIndicator = new ProgressIndicator();
8: tProgIndicator.IsVisible = true;
9: //操作與ProgressBar相同的屬性
10: tProgIndicator.IsIndeterminate = true;
11: tProgIndicator.Text = "Loading...";
12: //將ProgressIndicator加入SystemTray之中,並指定DependencyObject為Application Page。
13: SystemTray.SetProgressIndicator(this, tProgIndicator);
14: }
b. 使用XAML建立ProgressIndicator:
1: <shell:SystemTray.ProgressIndicator>
2: <shell:ProgressIndicator IsIndeterminate="True"
3: IsVisible="True" Text="Loading..." />
4: </shell:SystemTray.ProgressIndicator>
了解ProgressIndicator的建立方式之後,在使用時機上有一個要特別注意的:
1. 使用Popup來顯示ProgressBar可以在Application Page上在蓋上一個UI Control,告知使用者目前不可操作畫面;
2. 使用ProgressIndicator,其Application Page上的畫面是可以繼續操作的,因此需注意使用的情境與對象;
[補充]
‧ 如何動態取得目前畫面的Width/Height;
如果想使用目前畫面的Size來修改要呈現的UI Control時,直接使用Application Page的Width/Height是不行的,
建議可以使用:「App.Current.RootVisual.RenderSize.Height」或「App.Current.RootVisual.RenderSize.Width」;
使用時機在Application Page的Loaded事件之後。
======
概略地說明與補充了相關SystemTray的應用與經驗,希望對大家在開發上有所幫助。感謝。
References:
‧Know About WP7 System Tray - Tips to Show or Hide it
‧Windows Phone 实用开发技巧(18):使用SystemTray显示全局消息提醒
‧Windows Phone 实用开发技巧(20):ApplicationBar 的Text国际化
‧Windows Phone 实用开发技巧(26):对DataTemplate中的元素播放动画
‧W17: Windows Phone 7 System Tray
‧WP7 System Tray Progress Indicator