如何避免行定义重复

本文关键字:定义 何避免 | 更新日期: 2023-09-27 18:36:43

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

        <RowDefinition Height="Auto" />

我想避免代码重复,因为它大约有 10 行,一个接一个地进行。怎么能做到呢?

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

如何避免行定义重复

我认为不可能以某种方式速记网格行,尤其是当并非所有网格行都将 Height 属性设置为"自动"时。您可以尝试使用附加的依赖项属性,如此处所示。

请注意,此示例指定网格行数,您可以看到它以编程方式设置每行的 Height 属性。您可能必须以更复杂的方式决定为每行分配哪个高度。尽管此解决方案在 XAML 中可能更美观,但实现起来可能更复杂,并且您可能很难为每行分配适当的高度。就个人而言,声明每一行似乎更容易,因为Visual Studio将允许折叠标签和一个漂亮,清晰的方面。

我希望这有帮助!

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