Xamarin.Forms 디바이스 클래스
이 Device
클래스에는 개발자가 플랫폼별로 레이아웃 및 기능을 사용자 지정하는 데 도움이 되는 다양한 속성과 메서드가 포함되어 있습니다.
특정 하드웨어 형식 및 크기의 Device
코드를 대상으로 하는 메서드 및 속성 외에도 클래스에는 백그라운드 스레드의 UI 컨트롤과 상호 작용하는 데 사용할 수 있는 메서드가 포함되어 있습니다. 자세한 내용은 백그라운드 스레드에서 UI와 상호 작용을 참조 하세요.
플랫폼별 값 제공
Xamarin.Forms 2.3.4 이전에는 애플리케이션이 실행되고 있던 플랫폼을 속성을 검사하여 Device.OS
, TargetPlatform.Android
및 TargetPlatform.WinPhone
열거형 값과 TargetPlatform.Windows
비교하여 TargetPlatform.iOS
얻을 수 있었습니다. 마찬가지로 오버로드 중 Device.OnPlatform
하나를 사용하여 플랫폼별 값을 컨트롤에 제공할 수 있습니다.
그러나 2.3.4 이후 Xamarin.Forms 이러한 API는 더 이상 사용되지 않으며 대체되었습니다. 이제 클래스에는 Device
플랫폼 , (Device.WinPhone
Device.Android
사용되지 않음), (사용되지 않음), Device.WinRT
Device.UWP
및 Device.macOS
플랫폼을 Device.iOS
식별하는 공용 문자열 상수가 포함됩니다. 마찬가지로 Device.OnPlatform
오버로드는 및 On
API로 OnPlatform
대체되었습니다.
C#에서는 속성에 문을 만든 switch
다음 필요한 플랫폼에 대한 Device.RuntimePlatform
문을 제공하여 플랫폼별 값을 제공할 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);
및 On
클래스는 OnPlatform
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
인스턴스화해야 하는 제네릭 클래스입니다. 클래스에서 On
특성은 Platform
단일 string
값 또는 여러 쉼표로 구분된 string
값을 허용할 수 있습니다.
Important
클래스에서 On
잘못된 Platform
특성 값을 제공해도 오류가 발생하지 않습니다. 대신 플랫폼별 값을 적용하지 않고 코드가 실행됩니다.
OnPlatform
또는 XAML에서 태그 확장을 사용하여 플랫폼별로 UI 모양을 사용자 지정할 수 있습니다. 자세한 내용은 OnPlatform 태그 확장을 참조 하세요.
Device.Idiom
이 Device.Idiom
속성을 사용하여 애플리케이션이 실행 중인 디바이스에 따라 레이아웃 또는 기능을 변경할 수 있습니다. TargetIdiom
열거는 다음 값을 포함합니다.
- 휴대폰 – iPhone, iPod 터치 및 Android 디바이스가 600딥보다 좁아집니다^
- 태블릿 – iPad, Windows 디바이스 및 Android 디바이스가 600딥보다 넓습니다^
- 데스크톱 – Windows 10 데스크톱 컴퓨터의 UWP 앱 에서만 반환됨(Continuum 시나리오를 포함하여 모바일 Windows 디바이스에서 반환
Phone
) - TV – Tizen TV 장치
- 시계 – Tizen 시계 장치
- 지원 되지 않음 – 사용되지 않음
^ 딥이 반드시 물리적 픽셀 수가 아닌 경우
이 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
인스턴스화해야 하는 제네릭 클래스입니다.
OnIdiom
또는 XAML에서 태그 확장을 사용하여 애플리케이션이 실행 중인 디바이스의 관용구에 따라 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
.NET Standard 라이브러리를 포함하여 공통 코드에서 Xamarin.Forms 작동하는 시간 종속 작업을 트리거하는 간단한 방법을 제공하는 메서드도 있습니다. 간격을 설정하고 타이머를 계속 실행하거나 false
현재 호출 후 중지하도록 반환 true
하려면 a TimeSpan
를 전달합니다.
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
메서드 사용에 대한 .NET Standard 대안입니다Device.StartTimer
.System.Threading.Timer
백그라운드 스레드에서 UI와 상호 작용
iOS, Android 및 유니버설 Windows 플랫폼 포함한 대부분의 운영 체제는 사용자 인터페이스와 관련된 코드에 단일 스레딩 모델을 사용합니다. 이 스레드를 주 스레드 또는 UI 스레드라고 하는 경우가 많습니다. 이 모델의 결과는 사용자 인터페이스 요소에 액세스하는 모든 코드가 애플리케이션의 주 스레드에서 실행되어야 한다는 것입니다.
애플리케이션은 경우에 따라 백그라운드 스레드를 사용하여 웹 서비스에서 데이터를 검색하는 등의 장기 실행 작업을 수행할 수 있습니다. 백그라운드 스레드에서 실행되는 코드가 사용자 인터페이스 요소에 액세스해야 하는 경우 주 스레드에서 해당 코드를 실행해야 합니다.
클래스에는 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
});