Я видел несколько вариантов, которые, кажется, работают для написания XAML для конкретной платформы:
Встроенный
<OnPlatform x:Key="MyKey"
x:TypeArguments="x:Single"
Android="30"
iOS="20">
</OnPlatform>
Вложено со значением
<OnPlatform x:TypeArguments="Thickness">
<On Platform="Android" Value="0, 0, 0, 0"/>
<On Platform="iOS" Value="0, 20, 0, 0"/>
</OnPlatform>
Как видно, например здесь .
Вложено как содержимое
<OnPlatform x:Key="MyOtherKey" x:TypeArguments="x:Double">
<On Platform="Android">40</On>
<On Platform="iOS">40</On>
</OnPlatform>
Что-то было действительным, но теперь устарело и согласно этому сообщению в блоге похоже, что оно соответствует версии, которую я называю "встроенной" в этом сообщении.
Каковы (технические) различия между этими тремя вариантами?
Мотивация на мой вопрос:
«Вложенный как контент» работает для меня, когда я использую его в качестве статического ресурса, но когда он передается моему IValueConverter
, все значения, относящиеся к платформе, устанавливаются на 0. То же самое происходит, когда я использую «Вложенный со значением». версия. Но устаревшая «встроенная» версия работает, как и ожидалось. Так что, похоже, существуют различия в том, как эти опции работают за сценой.
Я только что нашел источник , и, похоже, соответствующим дополнением к новой версии является фрагмент кода:
#pragma warning disable RECS0108 // Warns about static fields in generic types
static readonly IValueConverterProvider s_valueConverter = DependencyService.Get<IValueConverterProvider>();
#pragma warning restore RECS0108 // Warns about static fields in generic types
public static implicit operator T(OnPlatform<T> onPlatform)
{
foreach (var onPlat in onPlatform.Platforms) {
if (onPlat.Platform == null)
continue;
if (!onPlat.Platform.Contains(Device.RuntimePlatform))
continue;
if (s_valueConverter == null)
continue;
return (T)s_valueConverter.Convert(onPlat.Value, typeof(T), null, null);
}
if (!onPlatform.useLegacyFallback)
return onPlatform.hasDefault ? onPlatform.@default : default(T);
//legacy fallback
#pragma warning disable 0618, 0612
return Device.OnPlatform(iOS: onPlatform.iOS, Android: onPlatform.Android, WinPhone: onPlatform.WinPhone);
#pragma warning restore 0618, 0612
}
, который иногда возвращает OnPlatform
, а иногда и значение по умолчанию, в зависимости от используемой версии. (Я все еще был бы признателен за ответ, который мог бы объяснить последствия более подробно, и что говорит против использования устаревшей версии)