我有15-20行,其中一些是不同的,但大多数是相似的:
<RowDefinition Height="Auto" />
我想避免代码重复,因为它大约有10行,这是一个接一个。怎么办呢?
它可以在没有XAML的代码中完成,但我认为这是解决这个问题的错误方法。
答案 0 :(得分:1)
我认为不可能以某种方式简化网格行的声明,特别是当不是所有网格行都将Height属性设置为“Auto”时。您可以尝试使用附加的依赖项属性,如演示here。
请注意,此示例指定网格行的数量,您可以看到它以编程方式设置每行的Height属性。您可能必须以更复杂的方式决定要为每行分配的高度。 虽然这个解决方案可能在XAML中更具美感,但实现起来可能更复杂,并且您可能很难为每一行分配适当的高度。 就个人而言,只是声明每一行似乎更容易,因为Visual Studio将允许折叠标记和一个漂亮,清晰的方面。
我希望这有帮助!
答案 1 :(得分:0)
我之前通过编写一个提供附加属性的类来解决这个问题,该类基于简单的逗号分隔列表自动定义行和列。您基本上需要做的是创建一个附加属性(我称之为AutoRows
并为属性更改的元数据定义一个方法。该方法解析该值并简单地创建新的RowDefinition
元素。
我使用了一种简单的语法,其中逗号分隔列表中的每个值等于一行。因此,20,20,20
会创建3行,其高度为20
。为了允许高度为auto
的行并节省空间,我添加了一种新格式来定义块中的多个自动行。例如,20,~5,20
定义一个高度为20
的行,然后定义5个自动行,最后定义另一个高度为20
的行。
我的变更处理程序基本上是这样做的:
public static void AutoRowsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
RowDefinitionCollection rows = ((Grid)obj).RowDefinitions;
rows.Clear();
foreach (string segment in ((string)e.NewValue).Split(','))
{
if (segment.StartsWith("~"))
{
int count;
if (!int.TryParse(segment.Substring(1), out count))
count = 1;
for (int i = 0; i < count; i++)
rows.Add(new RowDefinition() { Height = GridLength.Auto });
}
else
{
GridLengthConverter converter = new GridLengthConverter();
rows.Add(new RowDefinition() { Height = (GridLength)converter.ConvertFromString(segment) });
}
}
}
我遗漏了几行,确保正确解析并且没有任何失败。如您所见,我使用GridLengthConverter
使每个非自动值接受普通RowDefinition
支持的任何值。因此,您可以通过逗号轻松加入所有行高,并将其用作附加属性的值。