如何避免RowDefinition重复?

时间:2012-06-08 07:54:59

标签: c# wpf

我有15-20行,其中一些是不同的,但大多数是相似的:

        <RowDefinition Height="Auto" />

我想避免代码重复,因为它大约有10行,这是一个接一个。怎么办呢?

它可以在没有XAML的代码中完成,但我认为这是解决这个问题的错误方法。

2 个答案:

答案 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支持的任何值。因此,您可以通过逗号轻松加入所有行高,并将其用作附加属性的值。