2012-06-08 175 views
3

我有15-20行,他们中的一些是不同的,但大部分都是类似的:如何避免RowDefinition重复?

 <RowDefinition Height="Auto" /> 

我想避免重复代码,因为它是约10行,其中去一个接一个。如何做呢?

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

回答

1

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

请注意,此示例指定网格行的数量,您可以看到它以编程方式设置每行的高度属性。您可能需要以更复杂的方式决定要分配给每行的高度。 虽然这种解决方案在XAML中可能更具审美性,但实现起来可能会更加复杂,您可能很难为每行分配合适的高度。 个人而言,声明每一行似乎更容易,因为Visual Studio将允许合并标记和一个很好,清晰的方面。

我希望这有助于!

0

我之前通过编写一个提供附加属性的类来基于简单的逗号分隔列表自动定义行和列,从而解决了这个问题。你基本上需要做的是创建一个附加的属性(我称之为AutoRows并为属性更改的元数据定义了一种方法,该方法解析该值并简单地创建新的RowDefinition元素。因此,20,20,20将创建3行,高度为20。为了允许高度为auto的行并节省空间,我添加了一种新格式来定义块中的多个自动行。例如,20,~5,20定义了一行高度为20,然后是5个自动行,最后是另一行高度为20

我的c hange处理程序基本上这样做:

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