在样式中设置Grid RowDefinitions / ColumnDefinitions属性

时间:2017-08-14 18:28:38

标签: xaml xamarin.forms xamarin.forms-styles

假设您有两个或多个共享相同结构的网格(行/列数和属性相等)。

是否可以创建样式并设置 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 />标记。

5 个答案:

答案 0 :(得分:8)

您无法在样式中定义RowDefinitionColumnDefinition,但可以将其创建为可重用资源。我想这就是你要找的东西。像这样定义ColumnDefinitionCollectionRowDefinitionCollection允许您将它们与多个网格一起重复使用,以创建一致的外观。

<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中那样更像一个网格样式。但对于将要实施的内容和方式知之甚少。