[UWP] 控制項基底類別 Control 的新東西

許多常見的控制項會繼承 Control 類別,Control 類別從 OS 組件版本 10240 到目前最新的版本 16299,歷經兩年多的時間,也有了許多更動,以下針對各個版本的更動做介紹。

 

SDK 14393

public ElementSoundMode ElementSoundMode { get; set; }

設定控制項的音效模式
這是針對 UWP on XBOX 而生的屬性,在 SDK 14393 之後 UWP 可以幾近無痛地轉移到 XBOX 平台執行。XBOX 平台的特性包含了 1. 使用者是使用手把在控制 app 2. 使用者通常會坐在離螢幕一定的距離,在這兩個特性之下,為了使用者體驗,app 必須支援如 切換 focus、點擊、退出、切換頁面 等音效,而 UWP SDK 也很貼心地幫開發者在常見的內建控制項 (ListView、Button... 等) 加上了音效。

更動 Windows.UI.Xaml.ElementSoundPlayer.State 屬性可以指定全域性的音效播放行為。
  1. 設定為 ElementSoundPlayerState.Off 則 app 執行在所有平台上,都不會有音效。
  2. 設定為 ElementSoundPlayerState.On 則所有平台都會有音效。
  3. 設定為 ElementSoundPlayerState.Auto (即預設值),則系統會根據目前 app 所執行的平台而自動調整音效設定,目前僅有 Xbox 在此設定下會有音效。
而更動控制項的 ElementSoundMode 屬性則可針對特定控制項調整音效播放行為。
 

public bool IsFocusEngagementEnabled { get; set; }

設定控制項是否有自己內部的 Focus 行為
這也是針對 UWP on XBOX 而生的屬性,由於 XBOX app 大多仰賴手把的方向鍵控制,所以將 Focus 行為最佳化是開發 UWP on XBOX app 的重點之一,若是開發者作了一個較為複雜的父控制項,該父控制項內含多個子控制項,且開發者預期使用者會在 Focus 至父控制項後按下 A才可以進而切換內部子控制項間 Focus,則需要將父控制項的 IsFocusEngagementEnabled 設為 true,並監聽父控制項的 FocusEngaged 事件,在 FocusEngaged 的 EventHandler 內處理內部子元件之間的 Focus 行為。

通常在使用者 Focus 到父控制項並按下手把上的 A 鍵,且父控制項的 IsFocusEngagementEnabled 為 true 時,會觸發 FocusEngaged 事件。
 

public bool IsFocusEngaged { get; set; }

當控制項的 IsFocusEngagementEnabled 設定為 true 時,若控制項正處於 FocusEngaged 狀態 (即 Focus 行為從全域轉變為僅限於該控制項內),則此屬性為 true。當使用者按下手把上的 B 鍵時,則可退出 FocusEngaged 狀態 (即 Focus 從僅限於該控制項轉變回全域)。

 

public event TypedEventHandler FocusEngaged<Control, FocusEngagedEventArgs>

當控制項進入 FocusEngaged 狀態時會觸發此事件。

 

public event TypedEventHandler FocusDisengaged<Control, FocusDisengagedEventArgs>

當控制項退出 FocusEngaged 狀態時會觸發此事件。

 

public DependencyObject XYFocusUp { get; set; }

指定當控制項被 Focused 且按下手把上的上鍵時,會切換 Focus 至哪個控制項

 

public DependencyObject XYFocusDown { get; set; }

指定當控制項被 Focused 且按下手把上的下鍵時,會切換 Focus 至哪個控制項

 

public DependencyObject XYFocusLeft { get; set; }

指定當控制項被 Focused 且按下手把上的左鍵時,會切換 Focus 至哪個控制項

 

public DependencyObject XYFocusRight { get; set; }

指定當控制項被 Focused 且按下手把上的右鍵時,會切換 Focus 至哪個控制項

 

public RequiresPointer RequiresPointer { get; set; }

設定是否在 XBOX 上啟用游標模式
這也是針對 UWP on XBOX 而生的屬性,XBOX app 預設是使用手把透過方向鍵做 Focus 切換,但若某些控制項較難透過 Focus 切換時,則可將 RequiresPointer 屬性設定為 RequiresPointer.WhenEngaged 或 RequiresPointer.WhenFocused 以啟用游標模式。

設定為 RequiresPointer.WhenEngaged 時,使用者需先移動 Focus 至指定控制項,並在按下手把上的 A 鍵進入 FocusEngaged 模式的同時,即啟用游標模式。
設定為 RequiresPointer.WhenFocused 時,則使用者只要透過手把移動 Focus 至該控制項時便會啟用游標模式。
 

SDK 15063

public Uri DefaultStyleResourceUri { get; set; }

指定預設的 Style 路徑