반응형
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>
그러나 텍스트 상자를 표시하면 텍스트 상자의 위쪽 및 아래쪽 테두리가 텍스트 상자 위/아래쪽 테두리에 닿게 됩니다.이 레이아웃의 행에 수직 공간을 추가하는 가장 좋은 방법은 무엇입니까?
가장 쉬운 방법은 개별 컨트롤에 여백을 설정하는 것입니다.텍스트 상자에 설정하는 것으로 충분합니다. 텍스트 상자가 간격을 두면 레이블이 각 행의 중앙에 수직으로 설정되고 공간이 충분하기 때문입니다.
스타일을 사용하여 한 번 설정할 수 있습니다.
<Grid Margin="4">
<Grid.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Margin" Value="0,0,0,4" />
</Style>
</Grid.Resources>
...
</Grid>
이렇게 하면 그리드 내의 텍스트 상자 하단에 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
네,ComboBox
es 등)
텍스트 상자의 수직 정렬을 가운데로 설정하는 것은 어떻습니까?
<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>
언급URL : https://stackoverflow.com/questions/895909/spacing-between-child-controls-in-wpf-grid
반응형
'programing' 카테고리의 다른 글
SQL Server 복제 프로젝트에서 "잘못된 형식의 프로그램을 로드하려고 했습니다" 오류가 발생함 (0) | 2023.05.11 |
---|---|
iOS 9에서 URL SCHEMPH로 Instagram 앱을 열지 않음 (0) | 2023.05.11 |
다른 모든 컨트롤보다 오버레이 컨트롤을 우선시하는 방법은 무엇입니까? (0) | 2023.05.06 |
유형 오류: 'zip' 개체를 구독할 수 없습니다. (0) | 2023.05.06 |
Postgre를 삭제할 수 없습니다.SQL 역할입니다.오류: "일부 개체가 종속되어 있으므로 삭제할 수 없습니다." (0) | 2023.05.06 |