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

Que*_*mer 2 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>
Run Code Online (Sandbox Code Playgroud)

Ray*_*rns 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>
Run Code Online (Sandbox Code Playgroud)

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

如果你喜欢自动调整大小在网格上,而不是明星上浆(3*和7*),你可以通过设置使用一个共享的大小范围IsSharedSizeScopeItemsControlSharedSizeGroup第一ColumnDefinition.

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