在样式中设置网格行定义/列定义属性



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

是否可以创建样式并设置定义/列定义

我试过了。但是当应用程序尝试解析 xaml 时,我收到此异常:

Xamarin.Forms.Xaml.XamlParseException:位置 14:9。属性值为空或不可枚举

我的源代码:

<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 />标记。

不能在样式中定义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>

我找到了一个更好、更简单的解决方案。答案只是在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>

感谢@j.f.,我找到了解决方案。我将他的想法与我的想法结合起来,结果如下:

诀窍是将声明添加到单独的资源中并在样式中引用它。

<StackLayout>
<StackLayout.Resources>
<ResourceDictionary>
<RowDefinitionCollection x:Key="MyRowDefinitionCollection">
<RowDefinition />
<RowDefinition />
</RowDefinitionCollection>
<Style TargetType="Grid">
<Setter Property="RowDefinitions" Value="{StaticResource MyRowDefinitionCollection}" />
</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>

您可以创建从 Grid 派生的类

public class MyGrid : Grid

设置它,然后在 XAML 中的所有位置使用

<local:MyGrid> 

正如j.f所提到的,它被称为用户控制

Nou 你不能,在我看来你不应该。

定义网格与样式无关,与布局有关。

从Xamarin.Forms版本3开始,将引入更多类似CSS的样式功能。也许那时您将能够像在HTML/CSS中那样设置网格样式。但是,对于将实施什么以及如何实施知之甚少。

相关内容

  • 没有找到相关文章

最新更新