Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免行定义重复?_C#_Wpf - Fatal编程技术网

C# 如何避免行定义重复?

C# 如何避免行定义重复?,c#,wpf,C#,Wpf,我有15-20行,其中一些不同,但大多数相似: <RowDefinition Height="Auto" /> 我想避免代码重复,因为它大约有10行,一行一行地进行。怎样才能做到呢 它可以在没有XAML的代码中完成,但我认为解决这个问题的方法是错误的。我认为不可能以某种方式简化网格行的声明,尤其是当并非所有网格行都将Height属性设置为“Auto”时。您可以尝试使用所演示的附加依赖项属性 请注意,此示例指定了网格行数,您可以看到它以编程方式设置了每行的Heig

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

        <RowDefinition Height="Auto" />

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


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

我认为不可能以某种方式简化网格行的声明,尤其是当并非所有网格行都将Height属性设置为“Auto”时。您可以尝试使用所演示的附加依赖项属性

请注意,此示例指定了网格行数,您可以看到它以编程方式设置了每行的Height属性。您可能需要以更复杂的方式决定为每行指定的高度。 虽然这个解决方案在XAML中可能更美观,但它的实现可能更复杂,并且您可能很难为每一行指定适当的高度。 就个人而言,将每一行声明为VisualStudio将允许折叠标记和一个漂亮、清晰的方面似乎更容易


我希望这有帮助

我以前通过编写一个类解决了这个问题,该类提供了一个附加属性,可以根据简单的逗号分隔列表自动定义行和列。基本上,您需要做的是创建一个附加属性(我称之为
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) });
        }
    }
}
public static void AutoRowsChanged(DependencyObject对象、DependencyPropertyChangedEventArgs e)
{
RowDefinitionCollection行=((网格)obj).RowDefinitions;
行。清除();
foreach(字符串段在((string)e.NewValue).Split(','))
{
if(带(“~”)的段开始)
{
整数计数;
如果(!int.TryParse(段子字符串(1),超出计数))
计数=1;
for(int i=0;i
我省略了几行代码,以确保正确解析,并且没有任何错误。如您所见,我使用
GridLengthConverter
使每个非自动值接受正常
RowDefinition
支持的任何值。因此,您可以轻松地用逗号连接所有行高度,并将其用作附加属性的值