有没有比网格更好的方法来排列WPF中的控件?

时间:2010-03-01 17:20:04

标签: wpf grid stackpanel

我使用网格来定义这个问题Grid vs Stackpanel中定义的适当性。但是,在处理网格时,您必须在网格中明确定义控件位置。当必须重新排序控件或向网格添加新控件时,这会变得很麻烦。以提供的代码为例,有没有办法让文本和文本框的行和列排成一行,以便以后轻松修改或扩展?

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="3*"/>
        <ColumnDefinition Width="7*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <TextBlock Text="Value One:"   Grid.Row="0" Grid.Column="0"/>
        <TextBox x:Name="TextBoxOne"   Grid.Row="0" Grid.Column="1"/>

    <TextBlock Text="Value Two:"   Grid.Row="1" Grid.Column="0"/>
        <TextBox x:Name="TextBoxTwo"   Grid.Row="1" Grid.Column="1"/>

    <TextBlock Text="Value Three:" Grid.Row="2" Grid.Column="0"/>
        <TextBox x:Name="TextBoxThree" Grid.Row="2" Grid.Column="1"/>
</Grid>

1 个答案:

答案 0 :(得分:5)

我编写了一个我使用的自定义控件,这样做非常容易,但在创建之前我通常使用这种东西:

<ControlTemplate x:Key="ColumnsTemplate" TargetType="HeaderedContentControl">
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="3*" />
      <ColumnDefinition Width="7*" />
    </Grid.ColumnDefinitions>
    <ContentPresenter Grid.Column="0" ContentSource="Header" />
    <ContentPresenter Grid.Column="1" />
  </Grid>
</ControlTemplate>

<ItemsControl ... ItemTemplate="{StaticResource ColumnsTemplate}">
  <HeaderedContentControl Header="Value One:">
    <TextBox x:Name="TextBoxOne" />
  </HeaderedContentControl>
  <HeaderedContentControl Header="Value Two:">
    <TextBox x:Name="TextBoxTwo" />
  </HeaderedContentControl>
  ...
</ItemsControl>

这样可以轻松添加/删除ItemsControl中的项目,或者更好的是数据绑定。

如果您更喜欢在网格上自动调整大小而不是星号大小(3 *和7 *),则可以通过在IsSharedSizeScopeItemsControl上设置SharedSizeGroup来使用共享大小调整范围在第一个ColumnDefinition

另一个选项是GridView,但我发现它更难以用于此目的。