对于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
代码位于ViewCell
。因此,我无法使用额外的ResourceDictionary
,并且代码隐藏文件中也没有OnSizeAllocated()
。
是否可以同时使用OnIdiom
和OnPlatform
?
答案 0 :(得分:17)
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>
答案 1 :(得分:2)
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>
答案 2 :(得分:2)
自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>
答案 3 :(得分:2)
这是在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>
答案 4 :(得分:0)
在代码中有效的一个选项是使用
if(Device.OS == TargetPlatform.Windows && Device.Idiom == TargetIdiom.Phone)
this.innerGrid.ColumnDefinitions.First().Width = new GridLength(100);
覆盖现有的Xaml定义。 innerGrid
是Xaml中使用的Grid
的名称。