3

Для UWP мне нужен другой размер для ширины столбца в Grid. Кроме того, значение должно отличаться на планшете и смартфоне.Можно ли смешивать OnIdiom и OnPlatform в XAML (Xamarin.Forms)?

Следующий код падает приложение

<ColumnDefinition> 
    <ColumnDefinition.Width> 
     <OnIdiom.Phone> 
      <OnPlatform x:TypeArguments="GridLength" iOS="*" Android="*" WinPhone="100" /> 
     </OnIdiom.Phone> 
     <OnIdiom.Tablet> 
      <OnPlatform x:TypeArguments="GridLength" iOS="*" Android="*" WinPhone="200" /> 
     </OnIdiom.Tablet> 
    </ColumnDefinition.Width> 
</ColumnDefinition> 

с

Тип OnIdiom.Phone не найден в Xmlns http://xamarin.com/schemas/2014/forms

Код в ViewCell. Поэтому я не могу использовать дополнительный ResourceDictionary, а также OnSizeAllocated() в коде отсутствует файл.

Можно ли использовать OnIdiom и OnPlatform?

ответ

9

OnIdiom, так же, как OnPlatform является объект, который вы должны объявить. В вашем случае вы устанавливаете свойство OnIdiom.Phone объекту, у которого его нет.

Ваш Xaml должен выглядеть как:

<ColumnDefinition> 
    <ColumnDefinition.Width> 
    <OnIdiom x:TypeArguments="GridLength"> 
     <OnIdiom.Phone> 
     <OnPlatform x:TypeArguments="GridLength" iOS="*" Android="*" WinPhone="100" /> 
     </OnIdiom.Phone> 
     <OnIdiom.Tablet> 
     <OnPlatform x:TypeArguments="GridLength" iOS="*" Android="*" WinPhone="200" /> 
     </OnIdiom.Tablet> 
    </OnIdiom> 
    </ColumnDefinition.Width> 
</ColumnDefinition> 
+0

Я попытался запустить приложение на локальной машине. Здесь ширина 200 не соблюдается. Разве он не попадает в категорию «Tablet»? – testing

+0

'Device.OS' является' Windows' и 'Device.Idiom' является' Desktop'. Существуют ли какие-либо определения для этого в XAML? «WinPhone» отлично работал. – testing

+1

поддержка «Desktop» в OnIdiom приземлилась несколько дней назад https://github.com/xamarin/Xamarin.Forms/pull/420. Исправление будет присутствовать в предстоящем 2.3.4-pre1 –

0

Один из вариантов, который работает в коде является использование

if(Device.OS == TargetPlatform.Windows && Device.Idiom == TargetIdiom.Phone) 
    this.innerGrid.ColumnDefinitions.First().Width = new GridLength(100); 

перезаписать существующее определение Xaml. innerGrid - это имя Grid, используемого в Xaml.

1

Xamarin.Forms Xaml Пример:

<OnPlatform x:TypeArguments="View"> 
    <OnPlatform.Android> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition> 
        <ColumnDefinition.Width> 
         <OnIdiom x:TypeArguments="GridLength" Tablet="100" Phone="50" /> 
        </ColumnDefinition.Width> 
       </ColumnDefinition> 
       <ColumnDefinition> 
        <ColumnDefinition.Width> 
         <OnIdiom x:TypeArguments="GridLength" Tablet="100" Phone="50" /> 
        </ColumnDefinition.Width> 
       </ColumnDefinition> 
      </Grid.ColumnDefinitions> 
     </Grid> 
    </OnPlatform.Android> 
    <OnPlatform.iOS> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition> 
        <ColumnDefinition.Width> 
         <OnIdiom x:TypeArguments="GridLength" Tablet="100" Phone="50" /> 
        </ColumnDefinition.Width> 
       </ColumnDefinition> 
       <ColumnDefinition> 
        <ColumnDefinition.Width> 
         <OnIdiom x:TypeArguments="GridLength" Tablet="100" Phone="50" /> 
        </ColumnDefinition.Width> 
       </ColumnDefinition> 
      </Grid.ColumnDefinitions> 
     </Grid> 
    </OnPlatform.iOS> 
</OnPlatform> 
+0

ОК, я умножать полное 'определение Grid'. Но у меня есть несколько названных «Label», и нельзя иметь несколько ярлыков с тем же именем. Любое решение для этого? – testing

Смежные вопросы