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が押しつぶされ、上下の境界が上下のTextBoxに接触します。このレイアウトの行に垂直方向のスペースを追加する最良の方法は何ですか?
最も簡単な方法は、個々のコントロールにマージンを設定することです。 TextBoxに設定するだけで十分です。間隔をあけると、ラベルは各行の中央に垂直に設定され、とにかく十分なスペースがあるためです。
スタイルを使用して一度設定できます:
<Grid Margin="4">
<Grid.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Margin" Value="0,0,0,4" />
</Style>
</Grid.Resources>
...
</Grid>
これにより、グリッド内のTextBoxの下部に4ピクセルのマージンが追加されます。
別の素敵なアプローチを見ることができます ここ 。
Margin
プロパティを設定するためのクラスを作成します。
public class MarginSetter
{
public static Thickness GetMargin(DependencyObject obj) => (Thickness)obj.GetValue(MarginProperty);
public static void SetMargin(DependencyObject obj, Thickness value) => obj.SetValue(MarginProperty, value);
// Using a DependencyProperty as the backing store for Margin. This enables animation, styling, binding, etc…
public static readonly DependencyProperty MarginProperty =
DependencyProperty.RegisterAttached(nameof(FrameworkElement.Margin), typeof(Thickness),
typeof(MarginSetter), new UIPropertyMetadata(new Thickness(), MarginChangedCallback));
public static void MarginChangedCallback(object sender, DependencyPropertyChangedEventArgs e)
{
// Make sure this is put on a panel
var panel = sender as Panel;
if (panel == null) return;
panel.Loaded += Panel_Loaded;
}
private static void Panel_Loaded(object sender, EventArgs e)
{
var panel = sender as Panel;
// Go over the children and set margin for them:
foreach (FrameworkElement fe in panel.Children.OfType<FrameworkElement>())
fe.Margin = GetMargin(panel);
}
}
これでプロパティの動作がアタッチされたため、次のような構文が機能します。
<StackPanel local:MarginSetter.Margin="5">
<TextBox Text="hello" />
<Button Content="hello" />
<Button Content="hello" />
</StackPanel>
これは、同じタイプではない場合でも、パネルの複数の子にMargin
を設定する最も簡単で最速の方法です。 (つまり、Button
s、TextBox
es、ComboBox
esなど)
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>