2

我正在使用这个问题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>
4

1 回答 1

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*),您可以通过IsSharedSizeScope在第一个ItemsControlSharedSizeGroup上设置来使用共享大小范围ColumnDefinition

另一种选择是GridView,但我发现它更难用于此目的。

于 2010-03-01T17:41:55.720 回答