我有15-20行数据,其中一些不同,但大部分相似:
<RowDefinition Height="Auto" />
我想要避免代码重复,因为这大约有10行代码,需要逐行编写。如何解决这个问题?
可以通过代码实现而不是XAML来完成,但我认为这不是解决问题的正确方式。
我认为在网格行的声明中缩短代码并不可能,特别是当它们并非全部都设置了“自动”高度属性时。您可以尝试使用附加依赖属性,如此处所示。
请注意,此示例指定了网格行数,并且您可以看到它以编程方式设置了每行的高度属性。在更复杂的情况下,您可能需要决定为每行分配什么高度。虽然这种解决方案在XAML中可能更美观,但实现起来可能更加复杂,您可能会很难为每行分配适当的高度。个人认为,只需声明每行即可,Visual Studio将允许折叠标签,使其外观清晰明了。
希望这可以帮助您!
我之前通过编写一个类来解决这个问题,该类提供了一个附加属性,根据简单的逗号分隔列表自动定义行和列。你需要做的是创建一个附加属性(我称其为AutoRows
),并为属性更改元数据定义一个方法。该方法解析值,并简单地创建新的RowDefinition
元素。
我使用了一个简单的语法,其中逗号分隔列表中的每个值都等于一行。因此,20,20,20
将创建高度为20
的3行。为了允许高度为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
支持的任何值。因此,您可以轻松地通过逗号将所有行高连接起来,并将其用作附加属性的值。