在XAML中设置Grid或StackPanel元素之间距离的最佳方法是什么?

时间:2012-07-11 13:12:59

标签: wpf xaml

我有一个Grid,里面有一些元素:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <TextBlock Text="SomeText" Grid.Column="0" Grid.Row="0" />
    <TextBox Grid.Column="1" Grid.Row="0" />

    <TextBlock Text="SomeText" Grid.Column="0" Grid.Row="1" />
    <TextBox Grid.Column="1" Grid.Row="1" />

    <TextBlock Text="SomeText" Grid.Column="0" Grid.Row="2" />
    <TextBox Grid.Column="1" Grid.Row="2" />
</Grid>

问题在于它看起来很紧密:

what i have

Margin属性解决了这个问题,但我应该将此属性设置为网格内的每个元素。这是一个艰难的过程。

我想获得类似于此设置margin属性的内容,但不是每个元素:

what i want to obtain

3 个答案:

答案 0 :(得分:2)

您可以将Margin置于Style中的隐式Grid.Resources

e.g。

<Style x:Key="MarginStyle" TargetType="FrameworkElement">
     <Setter Property="Margin" Value="5"/>
</Style>
<Style TargetType="TextBox" BasedOn="{StaticResource MarginStyle}"/>
<Style TargetType="TextBlock" BasedOn="{StaticResource MarginStyle}"/>

您还可以使用ItemsControl来应用通用样式。

e.g。

<ItemsControl>
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <!-- Panel without children here -->
      <Grid>
        <Grid.ColumnDefinitions>
          <ColumnDefinition/>
          <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
          <RowDefinition Height="Auto"/>
          <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
      </Grid>
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>
  <ItemsControl.ItemContainerStyle>
    <Style TargetType="FrameworkElement">
      <Setter Property="Margin" Value="5"/>
    </Style>
  </ItemsControl.ItemContainerStyle>
  <!-- Children here -->
  <Label Grid.Row="0" Content="Field 1: "/>
  <Label Grid.Row="1" Content="Field 2: "/>
  <TextBox Grid.Column="1" Grid.Row="0"/>
  <TextBox Grid.Column="1" Grid.Row="1"/>
</ItemsControl>

答案 1 :(得分:0)

为什么不制作style并将其应用于元素?

答案 2 :(得分:0)

您可以将以下内容添加到网格的资源部分

    <Grid.Resources>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Margin" Value="0,5" />
        </Style>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="Margin" Value="0,5" />
        </Style>
    </Grid.Resources>

或者,您也可以使用填充了2列网格的垂直堆栈面板。

然后设置网格样式