我使用网格来定义这个问题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>
答案 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 *),则可以通过在IsSharedSizeScope
和ItemsControl
上设置SharedSizeGroup
来使用共享大小调整范围在第一个ColumnDefinition
。
另一个选项是GridView
,但我发现它更难以用于此目的。