類別 Device 包含數個屬性和方法,可協助開發人員根據每個平臺自定義版面配置和功能。
除了以特定硬體類型和大小為目標的程式代碼方法和屬性之外,類別 Device 還包含可用來與背景線程UI控制件互動的方法。 如需詳細資訊,請參閱 從背景線程與UI互動。
提供平臺特定值
在 Xamarin.Forms 2.3.4 之前,可以藉由檢查 Device.OS 屬性並將它 TargetPlatform.iOS與 、 TargetPlatform.Android、 TargetPlatform.WinPhone和 TargetPlatform.Windows 列舉值進行比較,來取得應用程式執行的平臺。 同樣地,其中一個 Device.OnPlatform 多載可用來為控件提供平臺特定值。
不過,自 2.3.4 起 Xamarin.Forms ,這些 API 已被取代並取代。 類別Device現在包含公用字串常數,可識別平臺 – Device.iOS、、Device.AndroidDevice.WinPhone(已淘汰)、(已淘汰)、 Device.WinRT Device.UWP和 Device.macOS。 同樣地,多 Device.OnPlatform 載已取代為 OnPlatform 和 On API。
在 C# 中,您可以在 屬性上Device.RuntimePlatform建立 switch 語句,然後提供必要平台的 語句來提供case平臺特定值:
double top;
switch (Device.RuntimePlatform)
{
case Device.iOS:
top = 20;
break;
case Device.Android:
case Device.UWP:
default:
top = 0;
break;
}
layout.Margin = new Thickness(5, top, 5, 0);
OnPlatform和 On 類別在 XAML 中提供相同的功能:
<StackLayout>
<StackLayout.Margin>
<OnPlatform x:TypeArguments="Thickness">
<On Platform="iOS" Value="0,20,0,0" />
<On Platform="Android, UWP" Value="0,0,0,0" />
</OnPlatform>
</StackLayout.Margin>
...
</StackLayout>
類別 OnPlatform 是泛型類別,必須以 x:TypeArguments 符合目標類型的屬性具現化。 在類別中OnPlatform,屬性可以接受單string一值或多個逗號分隔string值。
重要
在類別中On提供不正確的Platform屬性值不會產生錯誤。 相反地,程式代碼會執行,而不會套用平臺特定值。
或者, OnPlatform 標記延伸可以在 XAML 中用來自定義每個平臺的 UI 外觀。 如需詳細資訊,請參閱 OnPlatform 標記延伸。
Device.Idiom
Device.Idiom屬性可用來根據應用程式執行裝置來改變版面配置或功能。 TargetIdiom 列舉包含下列值:
- 手機 – iPhone、iPod touch 和 Android 裝置,小於 600 dips^
- 平板電腦 – iPad、Windows 裝置和 Android 裝置超過 600 dips^
- 傳統型 – 只在 Windows 10 桌面電腦上的 UWP app 中傳回 (行動裝置上傳回
Phone,包括在 Continuum 案例中) - 電視 – Tizen 電視裝置
- 監 看 - Tizen 監看裝置
- 不支援 – 未使用
^ dips 不一定是實體像素計數
屬性 Idiom 特別適用於建置利用較大螢幕的配置,如下所示:
if (Device.Idiom == TargetIdiom.Phone) {
// layout views vertically
} else {
// layout views horizontally for a larger display (tablet or desktop)
}
類別 OnIdiom 在 XAML 中提供相同的功能:
<StackLayout>
<StackLayout.Margin>
<OnIdiom x:TypeArguments="Thickness">
<OnIdiom.Phone>0,20,0,0</OnIdiom.Phone>
<OnIdiom.Tablet>0,40,0,0</OnIdiom.Tablet>
<OnIdiom.Desktop>0,60,0,0</OnIdiom.Desktop>
</OnIdiom>
</StackLayout.Margin>
...
</StackLayout>
類別 OnIdiom 是泛型類別,必須以 x:TypeArguments 符合目標類型的屬性具現化。
或者,標記延伸可以在 XAML 中使用, OnIdiom 根據應用程式執行裝置的慣用語來自定義 UI 外觀。 如需詳細資訊,請參閱 OnIdiom 標記延伸。
Device.FlowDirection
值 Device.FlowDirection 會 FlowDirection 擷取列舉值,代表裝置所使用的目前流程方向。 流動方向即為眼睛掃描頁面 UI 元素的方向。 這些列舉值為:
在 XAML 中 Device.FlowDirection ,可以使用標記延伸來擷取 x:Static 值:
<ContentPage ... FlowDirection="{x:Static Device.FlowDirection}"> />
C# 中的對等程式代碼為:
this.FlowDirection = Device.FlowDirection;
如需流程方向的詳細資訊,請參閱 從右至左當地語系化。
Device.Styles
屬性Styles包含可套用至某些控制件的內建樣式定義(例如 Label) Style 屬性。 可用的樣式如下:
- BodyStyle
- CaptionStyle
- ListItemDetailTextStyle
- ListItemTextStyle
- SubtitleStyle
- TitleStyle
Device.GetNamedSize
GetNamedSize 可在 C# 程式代碼中設定 FontSize 時使用:
myLabel.FontSize = Device.GetNamedSize (NamedSize.Small, myLabel);
someLabel.FontSize = Device.OnPlatform (
24, // hardcoded size
Device.GetNamedSize (NamedSize.Medium, someLabel),
Device.GetNamedSize (NamedSize.Large, someLabel)
);
Device.GetNamedColor
Xamarin.Forms 4.6 引進了具名色彩的支援。 具名色彩是一種色彩,其值會根據裝置上作用中的系統模式(例如淺色或深色)而有不同的值。 在 Android 上,會透過 R.Color 類別存取具名色彩。 在iOS上,具名色彩稱為 系統色彩。 在 通用 Windows 平台 上,具名色彩稱為 XAML 主題資源。
GetNamedColor方法可用來擷取 Android、iOS 和 UWP 上的具名色彩。 方法會採用 自 string 變數並傳 Color回 :
// Retrieve an Android named color
Color color = Device.GetNamedColor(NamedPlatformColor.HoloBlueBright);
Color.Default 找不到色彩名稱,或在不支援的平臺上叫用時 GetNamedColor ,將會傳回 。
注意
GetNamedColor因為方法會傳Color回平臺特有的,所以通常應該與 屬性搭配Device.RuntimePlatform使用。
類別 NamedPlatformColor 包含常數,這些常數會定義 Android、iOS 和 UWP 的具名色彩:
| Android | iOS | macOS | UWP |
|---|---|---|---|
BackgroundDark |
Label |
AlternateSelectedControlTextColor |
SystemAltHighColor |
BackgroundLight |
Link |
ControlAccent |
SystemAltLowColor |
Black |
OpaqueSeparator |
ControlBackgroundColor |
SystemAltMediumColor |
DarkerGray |
PlaceholderText |
ControlColor |
SystemAltMediumHighColor |
HoloBlueBright |
QuaternaryLabel |
DisabledControlTextColor |
SystemAltMediumLowColor |
HoloBlueDark |
SecondaryLabel |
FindHighlightColor |
SystemBaseHighColor |
HoloBlueLight |
Separator |
GridColor |
SystemBaseLowColor |
HoloGreenDark |
SystemBlue |
HeaderTextColor |
SystemBaseMediumColor |
HoloGreenLight |
SystemGray |
HighlightColor |
SystemBaseMediumHighColor |
HoloOrangeDark |
SystemGray2 |
KeyboardFocusIndicatorColor |
SystemBaseMediumLowColor |
HoloOrangeLight |
SystemGray3 |
Label |
SystemChromeAltLowColor |
HoloPurple |
SystemGray4 |
LabelColor |
SystemChromeBlackHighColor |
HoloRedDark |
SystemGray5 |
Link |
SystemChromeBlackLowColor |
HoloRedLight |
SystemGray6 |
LinkColor |
SystemChromeBlackMediumColor |
TabIndicatorText |
SystemGreen |
PlaceholderText |
SystemChromeBlackMediumLowColor |
Transparent |
SystemIndigo |
PlaceholderTextColor |
SystemChromeDisabledHighColor |
White |
SystemOrange |
QuaternaryLabel |
SystemChromeDisabledLowColor |
WidgetEditTextDark |
SystemPink |
QuaternaryLabelColor |
SystemChromeHighColor |
SystemPurple |
SecondaryLabel |
SystemChromeLowColor |
|
SystemRed |
SecondaryLabelColor |
SystemChromeMediumColor |
|
SystemTeal |
SelectedContentBackgroundColor |
SystemChromeMediumLowColor |
|
SystemYellow |
SelectedControlColor |
SystemChromeWhiteColor |
|
TertiaryLabel |
SelectedControlTextColor |
SystemListLowColor |
|
SelectedMenuItemTextColor |
SystemListMediumColor |
||
SelectedTextBackgroundColor |
|||
SelectedTextColor |
|||
Separator |
|||
SeparatorColor |
|||
ShadowColor |
|||
SystemBlue |
|||
SystemGray |
|||
SystemGreen |
|||
SystemIndigo |
|||
SystemOrange |
|||
SystemPink |
|||
SystemPurple |
|||
SystemRed |
|||
SystemTeal |
|||
SystemYellow |
|||
TertiaryLabel |
|||
TertiaryLabelColor |
|||
TextBackgroundColor |
|||
TextColor |
|||
UnderPageBackgroundColor |
|||
UnemphasizedSelectedContentBackgroundColor |
|||
UnemphasizedSelectedTextBackgroundColor |
|||
UnemphasizedSelectedTextColor |
|||
WindowBackgroundColor |
|||
WindowFrameTextColor |
Device.StartTimer
類別 Device 也有方法 StartTimer ,提供簡單的方法來觸發在一般程式代碼中 Xamarin.Forms 運作的時間相依工作,包括 .NET Standard 連結庫。 TimeSpan傳遞 以設定間隔並傳回 true ,讓定時器繼續執行,或在false目前的調用之後停止。
Device.StartTimer (new TimeSpan (0, 0, 60), () =>
{
// do something every 60 seconds
return true; // runs again, or false to stop
});
如果定時器內的程式代碼與使用者介面互動(例如設定 的 Label 文字或顯示警示),則應該在表達式內 BeginInvokeOnMainThread 完成(請參閱下方)。
注意
System.Timers.Timer和 System.Threading.Timer 類別是使用 Device.StartTimer 方法的 .NET Standard 替代方案。
從背景線程與UI互動
大部分的操作系統,包括 iOS、Android 和 通用 Windows 平台,都會針對涉及使用者介面的程式代碼使用單個線程模型。 此線程通常稱為 主線程 或 UI線程。 此模型的結果是,存取使用者介面專案的所有程式代碼都必須在應用程式的主要線程上執行。
應用程式有時會使用背景線程來執行可能長時間執行的作業,例如從 Web 服務擷取數據。 如果在背景線程上執行的程式代碼必須存取使用者介面元素,則必須在主線程上執行該程序代碼。
類別 Device 包含下列 static 方法,可用來與背景線程的使用者介面元素互動:
| 方法 | 引數 | 傳回 | 目的 |
|---|---|---|---|
BeginInvokeOnMainThread |
Action |
void |
在 Action 主線程上叫用 ,且不會等候它完成。 |
InvokeOnMainThreadAsync<T> |
Func<T> |
Task<T> |
在主要執行緒上叫用 Func<T>,並等候其完成。 |
InvokeOnMainThreadAsync |
Action |
Task |
在主要執行緒上叫用 Action,並等候其完成。 |
InvokeOnMainThreadAsync<T> |
Func<Task<T>> |
Task<T> |
在主要執行緒上叫用 Func<Task<T>>,並等候其完成。 |
InvokeOnMainThreadAsync |
Func<Task> |
Task |
在主要執行緒上叫用 Func<Task>,並等候其完成。 |
GetMainThreadSynchronizationContextAsync |
Task<SynchronizationContext> |
傳回主要執行緒的 SynchronizationContext。 |
下列程式代碼顯示使用 方法的 BeginInvokeOnMainThread 範例:
Device.BeginInvokeOnMainThread (() =>
{
// interact with UI elements
});