2012-05-13 39 views
6

我有一个网格。我必须手动定义每列和行,像这样:如何在不定义每行的情况下设置网格列/行大小?

<Window x:Class="GridBuild" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="GridBuild" Height="300" Width="300"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition/> 
    </Grid.RowDefinitions>   
    <Grid.ColumnDefinitions> 
     <ColumnDefinition/> 
     <ColumnDefinition/> 
    </Grid.ColumnDefinitions>   
</Grid> 

我想定义的行和列的数目与单行线,这样的事情:

<Window x:Class="GridBuild" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="GridBuild" Height="300" Width="300"> 
    <Grid> 
     <Grid.NumberOfRows="2"/> 
     <Grid.NumberOfColumns/> 
    </Grid> 
</Window> 

回答

4

我建议从Grid派生出来,并在其中添加如下属性:

public class GridEx : Grid 
{ 
    public int NumberOfRows 
    { 
     get { return RowDefinitions.Count; } 
     set 
     { 
      RowDefinitions.Clear(); 
      for (int i = 0; i < value; i++) 
       RowDefinitions.Add(new RowDefinition()); 
     } 
    } 

    public int NumberOfColumns 
    { 
     get { return ColumnDefinitions.Count; } 
     set 
     { 
      ColumnDefinitions.Clear(); 
      for (int i = 0; i < value; i++) 
       ColumnDefinitions.Add(new ColumnDefinition()); 
     } 
    } 
} 

现在,它可以被用作如下:

<local:GridEx NumberOfRows="3" NumberOfColumns="2"> 
    <TextBox>some text</TextBox> 
    <TextBox Grid.Row="1">some text</TextBox> 
    <TextBox Grid.Row="2">some text</TextBox> 

    <TextBox Grid.Column="1">some text</TextBox> 
    <TextBox Grid.Row="1" Grid.Column="1">some text</TextBox> 
    <TextBox Grid.Row="2" Grid.Column="1">some text</TextBox> 
</local:GridEx> 

工程在设计以及顺便说一下:)

这里的挑战是如何设置不同的宽度,高度等,为不同的行和列。我有一个很好的想法如何做到这一点。也可以自动分配Grid.Row和Grid.Column。想想:)

7

你所描述的是UniformGrid。它具有ColumnsRows属性,通过它可以设置所需的行数或列数。

如果您没有设置这些属性,UniformGrid会尝试尽可能将孩子布局为尽可能靠近正方形。在这种情况下,它希望在增加行数之前增加列数。

这是一个晦涩难懂的面板,但它正确使用时功能非常强大。

3

EvAlex的上述答案将起作用,但前提是您不希望使用数据绑定来设置列/行的数量。

public class GridEx : Grid 
{ 
    public int NumberOfRows 
    { 
     get { return RowDefinitions.Count; } 
     set 
     { 
      RowDefinitions.Clear(); 
      for (int i = 0; i < value; i++) 
       RowDefinitions.Add(new RowDefinition()); 
     } 
    } 

    public int NumberOfColumns 
    { 
     get { return ColumnDefinitions.Count; } 
     set 
     { 
      ColumnDefinitions.Clear(); 
      for (int i = 0; i < value; i++) 
       ColumnDefinitions.Add(new ColumnDefinition()); 
     } 
    } 
} 

如果你想通过数据绑定设置这些(像我一样),然后用上述溶液,编译器会抱怨,因为它需要DependencyProperties了点。一个DependencyProperty可以实现(使用C#6的nameof运营商)如下(一种快速插入它使用的是片段propdp):

public int Columns 
{ 
    get { return (int) GetValue(ColumnsDependencyProperty); } 
    set { SetValue(ColumnsDependencyProperty, value); } 
} 
public static readonly DependencyProperty ColumnsDependencyProperty = 
    DependencyProperty.Register(nameof(Columns), typeof(int), typeof(GridEx), new PropertyMetadata(0)); 

不过这样一来,你不能执行必要的逻辑来添加必要的号码RowDefinitions。要解决这个问题,请为每个DependencyProperty定义一个DependencyPropertyDescriptor,并在您的自定义类的构造函数中添加一个调用AddValueChanged所需的逻辑。然后每个propery的结果是(使用C#6的空条件运算符?.):

public int Columns 
    { 
     get { return (int) GetValue(ColumnsDependencyProperty); } 
     set { SetValue(ColumnsDependencyProperty, value); } 
    } 
    public static readonly DependencyProperty ColumnsDependencyProperty = 
     DependencyProperty.Register(nameof(Columns), typeof(int), typeof(GridEx), new PropertyMetadata(0)); 

    DependencyPropertyDescriptor ColumnsPropertyDescriptor = DependencyPropertyDescriptor.FromProperty(ColumnsDependencyProperty, typeof(GridEx)); 

    public GridEx() 
    { 
     ColumnsPropertyDescriptor?.AddValueChanged(this, delegate 
     { 
      ColumnDefinitions.Clear(); 
      for (int i = 0; i < Columns; i++) 
       ColumnDefinitions.Add(new ColumnDefinition()); 
     }); 
    } 
相关问题