UWPの場合、Grid
の列の幅に異なるサイズが必要です。さらに、値はタブレットとスマートフォンで異なる必要があります。
次のコードはアプリをクラッシュさせます
_<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
を一緒に使用することは可能ですか?
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>
Xamarin.Forms v3.2以降のはるかに優れた構文(新しい組み込みのXAML拡張機能を介して):
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{OnIdiom
Phone= {OnPlatform iOS=*, Android=*, UWP=100 },
Tablet= {OnPlatform iOS=*, Android=*, UWP=200 }}">
</ColumnDefinition>
</Grid.ColumnDefinitions>
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>
これは、xamlでOnIdiomとOnPlatformを混合するためのソリューションです。たとえば、スタックレイアウトのパディングにはバリエーションがあり、次のように実行できます-
<StackLayout.Padding>
<OnIdiom x:TypeArguments="Thickness">
<OnIdiom.Phone>
<OnPlatform x:TypeArguments="Thickness" iOS="0,40,0,0" Android="15,0" WinPhone="15,0" />
</OnIdiom.Phone>
<OnIdiom.Tablet>
<OnPlatform x:TypeArguments="Thickness" iOS="15,0" Android="15,0" WinPhone="15,0" />
</OnIdiom.Tablet>
</OnIdiom>
</StackLayout.Padding>
コードで機能する1つのオプションは、
if(Device.OS == TargetPlatform.Windows && Device.Idiom == TargetIdiom.Phone)
this.innerGrid.ColumnDefinitions.First().Width = new GridLength(100);
既存のXaml定義を上書きします。 innerGrid
は、Xamlで使用されるGrid
の名前です。