Поделиться через


Xamarin.Forms Класс устройства

Класс Device содержит ряд свойств и методов, которые помогают разработчикам настраивать макет и функциональные возможности на основе каждой платформы.

Помимо методов и свойств для целевого кода на определенных типах оборудования и размерах, Device класс включает методы, которые можно использовать для взаимодействия с элементами управления пользовательского интерфейса из фоновых потоков. Дополнительные сведения см. в разделе "Взаимодействие с пользовательским интерфейсом" из фоновых потоков.

Предоставление значений для конкретной платформы

Xamarin.Forms До 2.3.4 платформа, на которую запущено приложение, может быть получена путем изучения Device.OS свойства и сравнения его со TargetPlatform.iOSзначениями перечисления , TargetPlatform.AndroidTargetPlatform.WinPhoneи TargetPlatform.Windows перечисления. Аналогичным образом можно использовать одну из Device.OnPlatform перегрузок для предоставления определенных платформой значений элементу управления.

Однако с Xamarin.Forms 2.3.4 эти API были устарели и заменены. Теперь класс Device содержит открытые константы строк, определяющие платформы , Device.iOSDevice.Android(Device.WinPhoneнерекомендуемые), (нерекомендуемые), Device.WinRT Device.UWPи Device.macOS. Аналогичным образом Device.OnPlatform перегрузки были заменены OnPlatform API и On интерфейсами API.

В 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);

Классы 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 , соответствующего целевому типу. On В классе Platform атрибут может принимать одно string значение или несколько значений с разделителями-запятымиstring.

Внимание

Предоставление неверного Platform значения атрибута On в классе не приведет к ошибке. Вместо этого код будет выполняться без применения значения для конкретной платформы.

Кроме того, OnPlatform расширение разметки можно использовать в XAML для настройки внешнего вида пользовательского интерфейса на основе платформы. Дополнительные сведения см. в разделе "Расширение разметки OnPlatform".

Device.Idiom

Свойство Device.Idiom можно использовать для изменения макетов или функций в зависимости от устройства, на котором работает приложение. Перечисление TargetIdiom имеет такие значения:

  • Телефон — iPhone, iPod touch и устройства Android более узкие, чем 600 погружений^
  • Планшет — iPad, устройства Windows и устройства Android более 600 погружений^
  • Настольный компьютер — возвращается только в приложениях UWP на настольных компьютерах Windows 10 (возвращается Phone на мобильных устройствах Windows, включая в сценариях Continuum)
  • Телевизор — устройства 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 для настройки внешнего вида пользовательского интерфейса на основе идиомы устройства, на котором работает приложение. Дополнительные сведения см. в разделе OnIdiom Markup Extension.

Device.FlowDirection

Значение Device.FlowDirection извлекает FlowDirection значение перечисления, представляющее текущее направление потока, используемое устройством. Направление потока — это направление, в котором глаз человека перемещается по элементам пользовательского интерфейса на странице. Перечисление имеет следующие значения.

В 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
  • Подзаголовок
  • TitleStyle

Device.GetNamedSize

GetNamedSize можно использовать при настройке FontSize в коде C#:

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.Threading.Timer Классы System.Timers.Timer — это альтернативные варианты .NET Standard для использования Device.StartTimer метода.

Взаимодействие с пользовательским интерфейсом из фоновых потоков

Большинство операционных систем, в том числе iOS, Android и универсальная платформа Windows, используют модель однопотокового ввода для кода с участием пользовательского интерфейса. Этот поток часто называется основным потоком или потоком пользовательского интерфейса. Следствием этой модели является то, что весь код, обращаюющийся к элементам пользовательского интерфейса, должен выполняться в основном потоке приложения.

Приложения иногда используют фоновые потоки для выполнения потенциально длительных операций, таких как получение данных из веб-службы. Если код, выполняющийся в фоновом потоке, должен получить доступ к элементам пользовательского интерфейса, он должен запустить этот код в основном потоке.

Класс 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
});