WP7 - SystemTray與ProgressIndicator

Windows Phone 7 – SystemTray與ProgressIndicator

這一篇內容主要介紹一個大家撰寫App時第一件會做的事,「隱藏畫面最上方的系統軸」;

在Android或iOS裡,只有在遊戲模戲下,才能隱藏系統軸,其餘最多只能隱藏顯示應用程式的標題列。

但我在猜想:「是否由於iOS/Android可由頂端往下拉出通知範圍,所以不能隱藏系統軸?」,也許未來

WP也支援類似的功能後,系統軸隱藏的功能也不能了,但這只是猜測,先讓我們來看看怎麼實作吧。

 

SystemTray

     屬於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>的介紹,包括如下圖:

    

 

 

ProgressIndicator

     該類別用意在提供每個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

 

Dotblogs Tags: