다음을 통해 공유


Xamarin.Forms 디바이스 클래스

Device 클래스에는 개발자가 플랫폼별로 레이아웃 및 기능을 사용자 지정하는 데 도움이 되는 다양한 속성과 메서드가 포함되어 있습니다.

특정 하드웨어 형식 및 크기의 Device 코드를 대상으로 하는 메서드 및 속성 외에도 클래스에는 백그라운드 스레드의 UI 컨트롤과 상호 작용하는 데 사용할 수 있는 메서드가 포함되어 있습니다. 자세한 내용은 백그라운드 스레드에서 UI와 상호 작용을 참조 하세요.

플랫폼별 값 제공

Xamarin.Forms 2.3.4 이전에는 애플리케이션이 실행되고 있던 플랫폼을 속성을 검사하여 Device.OS , TargetPlatform.AndroidTargetPlatform.WinPhone열거형 값과 TargetPlatform.Windows 비교하여 TargetPlatform.iOS얻을 수 있었습니다. 마찬가지로 오버로드 중 Device.OnPlatform 하나를 사용하여 플랫폼별 값을 컨트롤에 제공할 수 있습니다.

그러나 2.3.4 이후 Xamarin.Forms 이러한 API는 더 이상 사용되지 않으며 대체되었습니다. 이제 클래스에는 Device 플랫폼 , (Device.WinPhoneDevice.Android사용되지 않음), (사용되지 않음), Device.WinRT Device.UWPDevice.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
});