2012-08-29 42 views
5

比如我可以做這樣的事情:在WPF中,有沒有一種方法可以像Grid一樣製作一個具有對齊列的StackPanel?

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition Width="Auto" /> 
     <ColumnDefinition Width="Auto" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Width="Auto"> 
     <RowDefinition Width="Auto"> 
     <RowDefinition Width="Auto"> 
    </Grid.RowDefinitions> 
    <TextBlock Grid.Row="0" Grid.Column="0">Header 1</TextBlock> 
    <TextBox Grid.Row="0" Grid.Column="1" MaxLines="1" /> 
    <Button Grid.Row="0" Grid.Column="2">Send</Button> 
    <Button Grid.Row="0" Grid.Column="3">Save</Button> 
    <TextBlock Grid.Row="1" Grid.Column="0">Header 2</TextBlock> 
    <TextBox Grid.Row="1" Grid.Column="1" MaxLines="1" /> 
    <Button Grid.Row="1" Grid.Column="2">Send</Button> 
    <Button Grid.Row="1" Grid.Column="3">Save</Button> 
    <TextBlock Grid.Row="2" Grid.Column="0">Header 3</TextBlock> 
    <TextBox Grid.Row="2" Grid.Column="1" MaxLines="1" /> 
    <Button Grid.Row="2" Grid.Column="2">Send</Button> 
    <Button Grid.Row="2" Grid.Column="3">Save</Button> 
</Grid> 

或者我可以做這樣的事情:

<StackPanel> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock>Header 1</TextBlock> 
     <TextBox MaxLines="1" /> 
     <Button>Send</Button> 
     <Button>Save</Button> 
    </StackPanel> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock>Header 2</TextBlock> 
     <TextBox MaxLines="1" /> 
     <Button>Send</Button> 
     <Button>Save</Button> 
    </StackPanel> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock>Header 3</TextBlock> 
     <TextBox MaxLines="1" /> 
     <Button>Send</Button> 
     <Button>Save</Button> 
    </StackPanel> 
<StackPanel> 

除了我希望能夠輕鬆地操縱行(添加新行,像在StackPanel中一樣移動行等),同時保持列正確對齊,就像在網格中一樣。

回答

3

您可以在列上使用許多單行Gridssize sharing。它在沒有任何控制的情況下變得冗長,因此您可以封裝一些邏輯(例如創建列和將Grid.Column分配給ItemsControlattached property的派生項)。

4

下面是我爲了大致相同的目的而扔在一起的一個類 - 基本上我希望能夠在左列中放置一堆標籤並在右側放置不同類型的值(文本框,下拉列表等)。

它只有兩列,但它可以適應不同的數字。

public class LabelValueGrid : Grid 
{ 
    public LabelValueGrid() 
     : base() 
    { 
     ColumnDefinitions.Add(new ColumnDefinition()); 
     ColumnDefinitions.Add(new ColumnDefinition()); 
     ColumnDefinitions[0].Width = new System.Windows.GridLength(1, System.Windows.GridUnitType.Auto); 
     ColumnDefinitions[1].Width = new System.Windows.GridLength(1, System.Windows.GridUnitType.Star); 
    } 

    protected override void OnVisualChildrenChanged(System.Windows.DependencyObject visualAdded, System.Windows.DependencyObject visualRemoved) 
    { 
     base.OnVisualChildrenChanged(visualAdded, visualRemoved); 

     int curRow = -1; 
     int curCol = 1; 

     RowDefinitions.Clear(); 

     if (Children != null) 
      foreach (System.Windows.UIElement curChild in Children) 
      { 
       if (curCol == 0) 
        curCol = 1; 
       else 
       { 
        curCol = 0; 
        curRow++; 
        RowDefinitions.Add(new RowDefinition() {Height = new System.Windows.GridLength(1, System.Windows.GridUnitType.Auto)}); 
       } 

       Grid.SetRow(curChild, curRow); 
       Grid.SetColumn(curChild, curCol); 
      } 

     RowDefinitions.Add(new RowDefinition() {Height = new System.Windows.GridLength(1, System.Windows.GridUnitType.Star)}); 
    } 
} 

我可以用這就像一個網格,除了我剛纔列出的控制,然後它會自動交替的列:

<local:LabelValueGrid> 
    <TextBlock Text="Label1"/> 
    <TextBox Name="value1"/> 
    <TextBlock Text="Label2"/> 
    <TextBox Name="value2"/> 
</local:LabelValueGrid> 
+0

只是爲了好玩,[這裏是爲UWP版本(HTTPS:/ /pastebin.com/2nstKFrC)基於這個代碼,似乎工作好。然而,我並不聰明地在UWP-land中找到相當於'OnVisualChildrenChanged'的東西,所以它只是一種你明確調用的方法,而不是'IEnumerable '。 – ruffin

相關問題