如何避免RowDefinition的重复?

3

我有15-20行数据,其中一些不同,但大部分相似:

        <RowDefinition Height="Auto" />

我想要避免代码重复,因为这大约有10行代码,需要逐行编写。如何解决这个问题?
可以通过代码实现而不是XAML来完成,但我认为这不是解决问题的正确方式。
2个回答

1

我认为在网格行的声明中缩短代码并不可能,特别是当它们并非全部都设置了“自动”高度属性时。您可以尝试使用附加依赖属性,如此处所示。

请注意,此示例指定了网格行数,并且您可以看到它以编程方式设置了每行的高度属性。在更复杂的情况下,您可能需要决定为每行分配什么高度。虽然这种解决方案在XAML中可能更美观,但实现起来可能更加复杂,您可能会很难为每行分配适当的高度。个人认为,只需声明每行即可,Visual Studio将允许折叠标签,使其外观清晰明了。

希望这可以帮助您!


0

我之前通过编写一个类来解决这个问题,该类提供了一个附加属性,根据简单的逗号分隔列表自动定义行和列。你需要做的是创建一个附加属性(我称其为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支持的任何值。因此,您可以轻松地通过逗号将所有行高连接起来,并将其用作附加属性的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接