Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Класс 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
});