我想要在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>
然而,当我显示它时,TextBoxes被压扁,它们的顶部和底部边框接触上方/下方的TextBox。在此布局中为行添加垂直空间的最佳方法是什么?
答案 0 :(得分:82)
最简单的方法是在各个控件上设置边距。在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像素的边距。
答案 1 :(得分:49)
可以看到另一种不错的方法here。
您可以创建用于设置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>
这是最简单的&amp;将Margin
设置为面板的多个子项的最快方法,即使它们的类型不同。 (即Button
s,TextBox
es,ComboBox
es等。)
答案 2 :(得分: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>