假设您有两个或多个共享相同结构的网格(行/列数和属性相等)。
是否可以创建样式并设置 RowDefinitions / ColumnDefinitions ?
我试过了。但是当应用程序尝试解析xaml时,我得到了这个异常:
Xamarin.Forms.Xaml.XamlParseException:位置14:9。属性值为null或不是IEnumerable
我的源代码:
<StackLayout>
<StackLayout.Resources>
<ResourceDictionary>
<Style TargetType="Grid">
<Setter Property="RowDefinitions">
<Setter.Value>
<RowDefinition />
<RowDefinition />
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
</StackLayout.Resources>
<Grid>
<Label Grid.Row="0" Text="(Grid #1) Row #1" />
<Label Grid.Row="1" Text="(Grid #1) Row #2" />
</Grid>
<Grid>
<Label Grid.Row="0" Text="(Grid #2) Row #1" />
<Label Grid.Row="1" Text="(Grid #2) Row #2" />
</Grid>
<Grid>
<Label Grid.Row="0" Text="(Grid #3) Row #1" />
<Label Grid.Row="1" Text="(Grid #3) Row #2" />
</Grid>
</StackLayout>
异常中的 位置14:9 指的是第一个<RowDefinition />
标记。
答案 0 :(得分:8)
您无法在样式中定义RowDefinition
和ColumnDefinition
,但可以将其创建为可重用资源。我想这就是你要找的东西。像这样定义ColumnDefinitionCollection
和RowDefinitionCollection
允许您将它们与多个网格一起重复使用,以创建一致的外观。
<ResourceDictionary>
<ColumnDefinitionCollection
x:Key="MyColumnDefinitionCollection">
<ColumnDefinition
Width="50" />
<ColumnDefinition
Width="100" />
<ColumnDefinition
Width="150" />
</ColumnDefinitionCollection>
<RowDefinitionCollection
x:Key="MyRowDefinitionCollection">
<RowDefinition
Height="50" />
<RowDefinition
Height="50" />
<RowDefinition
Height="100" />
<RowDefinition
Height="100" />
</RowDefinitionCollection>
</ResourceDictionary>
<Grid
ColumnDefinitions="{StaticResource MyColumnDefinitionCollection}"
RowDefinitions="{StaticResource MyRowDefinitionCollection}">
</Grid>
答案 1 :(得分:4)
感谢@ j.f。,我找到了解决方案。我把他的想法和我的想法结合在一起,结果就是这样:
诀窍是将声明添加到单独的资源中并在样式内引用它。
const local_date = new Date("2017-08-14T18:41:52.793-05:00");
答案 2 :(得分:3)
您可以创建一个派生自Grid
的类public class MyGrid : Grid
设置它,然后在xamls中随处使用
<local:MyGrid>
如j.f所述,它被称为用户控制
答案 3 :(得分:3)
我找到了一个更好,更简单的解决方案。答案是在 RowDefinition 标记周围添加 RowDefinitionCollection 标记。
像这样:<StackLayout>
<StackLayout.Resources>
<ResourceDictionary>
<Style TargetType="Grid">
<Setter Property="RowDefinitions">
<Setter.Value>
<RowDefinitionCollection>
<RowDefinition />
<RowDefinition />
</RowDefinitionCollection>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
</StackLayout.Resources>
<Grid>
<Label Grid.Row="0" Text="(Grid #1) Row #1" />
<Label Grid.Row="1" Text="(Grid #1) Row #2" />
</Grid>
<Grid>
<Label Grid.Row="0" Text="(Grid #2) Row #1" />
<Label Grid.Row="1" Text="(Grid #2) Row #2" />
</Grid>
<Grid>
<Label Grid.Row="0" Text="(Grid #3) Row #1" />
<Label Grid.Row="1" Text="(Grid #3) Row #2" />
</Grid>
</StackLayout>
答案 4 :(得分:0)
你不能,而且我认为你不应该。
定义网格不是关于样式,而是关于布局。
从Xamarin.Forms版本3开始,将会介绍更多类似CSS的样式功能。也许你可以像在HTML / CSS中那样更像一个网格样式。但对于将要实施的内容和方式知之甚少。