Windows 8 裝置形態多樣:平板、筆電、桌機、全螢幕、Snap 視圖、橫向/直向旋轉、不同 DPI 螢幕、高對比度輔助模式。本文系統性介紹如何查詢系統 UI 設定、處理視圖狀態變更、實作自適應動畫、支援多解析度圖片與高對比度主題。
UISettings ui = new UISettings();
bool animations = ui.AnimationsEnabled;
int caretBlink = ui.CaretBlinkRate;
bool caretBrowsing = ui.CaretBrowsingEnabled;
double caretWidth = ui.CaretWidth;
Windows.UI.ViewManagement.CursorSize cursorSize = ui.CursorSize;
int doubleClickTime = ui.DoubleClickTime;
Windows.UI.ViewManagement.HandPreference hand = ui.HandPreference;
int messageDuration = ui.MessageDuration;
int hoverTime = ui.MouseHoverTime;
double scrollArrow = ui.ScrollBarArrowSize;
double scrollBar = ui.ScrollBarSize;
double scrollThumb = ui.ScrollBarThumbBoxSize;
// 系統色彩
Color activeCaption = ui.UIElementColor(UIElementType.ActiveCaption);
Color background = ui.UIElementColor(UIElementType.Background);
// ... 其他色彩型別
// 高對比度偵測
AccessibilitySettings acc = new AccessibilitySettings();
bool highContrast = acc.HighContrast;
DisplayOrientations native = DisplayProperties.NativeOrientation; // 裝置原生方向
DisplayOrientations current = DisplayProperties.CurrentOrientation; // 目前方向
// 枚舉值:None, Landscape, Portrait, LandscapeFlipped, PortraitFlipped
// 鎖定目前方向
DisplayProperties.AutoRotationPreferences = DisplayProperties.CurrentOrientation;
// 解除鎖定
DisplayProperties.AutoRotationPreferences = DisplayOrientations.None;
// 監聽變更
DisplayProperties.OrientationChanged += (sender) => { /* 更新 UI */ };
FullScreenLandscape:全螢幕橫向FullScreenPortrait:全螢幕直向Snapped:320px 固定寬度側欄Filled:佔據剩餘空間的主視圖限制:Snap 需最小解析度 1366×768。
Window.Current.SizeChanged += (s, e) => { UpdateVisualState(); };
void UpdateVisualState() {
switch (ApplicationView.Value) {
case ApplicationViewState.Snapped: /* 簡化版面 */ break;
case ApplicationViewState.Filled: /* 完整版面 */ break;
// ...
}
}
// 嘗試解除 Snap
bool unsnapped = (ApplicationView.Value != ApplicationViewState.Snapped) || ApplicationView.TryUnsnap();
在 XAML 定義 VisualStateGroup,對應四種視圖狀態,並設定 VisualTransition 與緩動函數:
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="Landscape">
<Storyboard><ColorAnimation To="White" .../></Storyboard>
</VisualState>
<VisualState x:Name="Portrait">...</VisualState>
<VisualState x:Name="Snapped">...</VisualState>
<VisualState x:Name="Filled">...</VisualState>
<VisualStateGroup.Transitions>
<VisualTransition To="Snapped" GeneratedDuration="0:0:1">
<VisualTransition.GeneratedEasingFunction><ElasticEase EasingMode="EaseInOut"/></VisualTransition.GeneratedEasingFunction>
</VisualTransition>
<!-- 其他轉場 -->
</VisualStateGroup.Transitions>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
程式碼觸發:
VisualStateManager.GoToState(this, "Snapped", true);
Window.Current.Bounds)px = pt × dpi / 72,WinRT 以有效像素 (effective pixels) 為單位資料夾法:/Assets/scale-100/MyImage.png, /Assets/scale-140/MyImage.png, /Assets/scale-180/MyImage.png → 參考 /Assets/MyImage.png
檔名法:/Assets/scale/MyImage.scale-100.png, MyImage.scale-140.png, MyImage.scale-180.png → 參考 /Assets/scale/MyImage.png
ResolutionScale scale = DisplayProperties.ResolutionScale; // Scale100Percent 等
string scaleStr;
ResourceManager.Current.DefaultContext.QualifierValues.TryGetValue("Scale", out scaleStr);
TheImage.contrast-standard.png
TheImage.contrast-black.png
TheImage.contrast-white.png
// 結合縮放
TheImage.scale-100_contrast-black.png
<StackPanel>
<StackPanel.Resources>
<ResourceDictionary>
<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Default">
<SolidColorBrush x:Key="TargetForeground" Color="Red"/>
</ResourceDictionary>
<ResourceDictionary x:Key="HighContrastBlack">
<SolidColorBrush x:Key="TargetForeground" Color="White"/>
</ResourceDictionary>
<ResourceDictionary x:Key="HighContrastWhite">
<SolidColorBrush x:Key="TargetForeground" Color="Black"/>
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
</ResourceDictionary>
</StackPanel.Resources>
<TextBlock Foreground="{StaticResource TargetForeground}" Text="自動切換顏色"/>
</StackPanel>
string contrast;
ResourceManager.Current.DefaultContext.QualifierValues.TryGetValue("Contrast", out contrast);
掌握系統 UI 適應關鍵在於:查詢而非假設(使用 UISettings/DisplayProperties/ApplicationView),聲明式資源(縮放圖片、對比度主題),視覺狀態機(VisualStateManager)處理版面重組與動畫。如此才能在單一套件中提供一致且優質的跨裝置體驗。