2009-05-22 67 views
52

WPFウィンドウに表示するキー/値ペアのセットがあります。私はそうのようにそれらをレイアウトするためにグリッドを使用しています:WPFグリッド内の子コントロール間の間隔

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

    <Label Grid.Row="0" Grid.Column="0">Code</Label> 
    <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Code}"/> 

    <Label Grid.Row="1" Grid.Column="0">Name</Label> 
    <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Name}"/> 
</Grid> 

は、しかし、私はこれを表示する時に、テキストボックスがその上部と下部の境界線は、上記/下記のTextBoxに触れるとアップ押しつぶされています。このレイアウトの行に垂直スペースを追加する最善の方法は何ですか?

+0

かなり簡単な解決策:高さが設定された行を追加するだけです。したがって、行間に3ピクセルのスペースが必要な場合は、3の高さでそれらの間に新しい行を作成してください。 – Krythic

答えて

78

最も簡単な方法は、個々のコントロールに余白を設定することです。 TextBoxに設定するのは十分です。間隔が決まったら、ラベルは各行の中央に垂直に設定され、とにかく十分なスペースがあるためです。

あなたはスタイルを使用して、一度それを設定することができます。

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

    ... 
</Grid> 

これは、グリッド内の任意のテキストボックスの下に4ピクセルのマージンを追加します。

+0

これは私のためには機能していないようです。問題のコントロールがすでにスタイルを持っている場合、これは機能しませんか?あなたの例ではなく、コントロールに手動でマージンを設定することができます。 – Krythic

+0

私は別の解決策を見つけました。私がしたのは、3ピクセルの高さのコントロールの間に追加の行を追加することでした。魅力のように動作します。 – Krythic

47

別の素敵なアプローチはここで見ることができます: http://blogs.microsoft.co.il/blogs/eladkatz/archive/2011/05/29/what-is-the-easiest-way-to-set-spacing-between-items-in-stackpanel.aspx

このような構文がうまくいくように、それは、添付の動作を作成する方法を示しています。

<StackPanel local:MarginSetter.Margin="5"> 
    <TextBox Text="hello" /> 
    <Button Content="hello" /> 
    <Button Content="hello" /> 
</StackPanel> 

これはする最も簡単な&最速の方法です同じタイプでない場合でも、パネルの複数の子にマージンを設定します。 (つまり、ボタン、テキストボックス、コンボボックスなど)

+4

+1素晴らしいクラス名をLayoutSetterに変更し、同じ方法でそれを伝播するために、VerticalAlignmentのようないくつかのプロパティを追加しました。私は単純にFrameworkElementのスタイルを定義することができたらいいと思います... – surfen

+1

+1、Elad、とても素敵です – Luke

+0

子アイテムが動的に追加/削除された場合、ItemsControlが変化するコレクションにバインドされているなど。 –

2

TextBoxのVerticalAlignmentをCenterに設定するにはどうすればよいですか?

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

       <Label Grid.Row="0" Grid.Column="0">Code</Label> 
       <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Code}" VerticalAlignment="Center"/> 

       <Label Grid.Row="1" Grid.Column="0">Name</Label> 
       <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Name}" VerticalAlignment="Center"/> 
      </Grid> 
関連する問題