Xamarin.Forms Класс устройства
Класс Device
содержит ряд свойств и методов, которые помогают разработчикам настраивать макет и функциональные возможности на основе каждой платформы.
Помимо методов и свойств для целевого кода на определенных типах оборудования и размерах, Device
класс включает методы, которые можно использовать для взаимодействия с элементами управления пользовательского интерфейса из фоновых потоков. Дополнительные сведения см. в разделе "Взаимодействие с пользовательским интерфейсом" из фоновых потоков.
Предоставление значений для конкретной платформы
Xamarin.Forms До 2.3.4 платформа, на которую запущено приложение, может быть получена путем изучения Device.OS
свойства и сравнения его со TargetPlatform.iOS
значениями перечисления , TargetPlatform.Android
TargetPlatform.WinPhone
и TargetPlatform.Windows
перечисления. Аналогичным образом можно использовать одну из Device.OnPlatform
перегрузок для предоставления определенных платформой значений элементу управления.
Однако с Xamarin.Forms 2.3.4 эти API были устарели и заменены. Теперь класс Device
содержит открытые константы строк, определяющие платформы , Device.iOS
Device.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
});