Каковы различия между параметрами синтаксиса XAML OnPlatform? - PullRequest
0 голосов
/ 06 мая 2019

Я видел несколько вариантов, которые, кажется, работают для написания 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, а иногда и значение по умолчанию, в зависимости от используемой версии. (Я все еще был бы признателен за ответ, который мог бы объяснить последствия более подробно, и что говорит против использования устаревшей версии)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...