Подтвердить что ты не робот

WPF: выравнивание базовой линии метки и ее текстового поля

Скажем, у меня есть простой текстовый блок рядом с ярлыком:

<StackPanel>
    <StackPanel Orientation="Horizontal">
        <Label Margin="3">MyLabel</Label>
        <TextBox Margin="3" Width="100">MyText</TextBox>
    </StackPanel>
    ...
</StackPanel>

Это дает следующий результат:

result

Как вы можете видеть, базовые строки MyLabel и MyText не выровнены, что выглядит некрасиво. Конечно, я мог бы начать играть с полями до тех пор, пока они не совпадут, но поскольку это такое общее требование, я уверен, что WPF предоставляет гораздо более легкое и элегантное решение, которое я еще не нашел...

4b9b3361

Ответ 1

Это поведение, по-моему, вызвано тем, что по умолчанию TextBox соответствует вертикальному выравниванию Stretch, что заставляет его заполнять доступное пространство и иметь дополнительную пару пикселей под текстом. Если вы используете это вместо:

<StackPanel>
    <StackPanel Orientation="Horizontal">
        <Label >MyLabel</Label>
        <TextBox VerticalAlignment="Center" Width="100">MyText</TextBox>
    </StackPanel>
</StackPanel>

... вы должны увидеть более чистый результат.

Ответ 2

Как вы думаете?

alt text

<StackPanel Orientation="Horizontal">
        <Label Margin="3" VerticalContentAlignment="Center">MyLabel</Label>
        <TextBox Margin="3" VerticalContentAlignment="Center" Width="100">MyText</TextBox>
 </StackPanel>

Ответ 3

Я достиг этого взгляда в Каксамле:

<StackPanel Orientation="Horizontal">
  <Label Margin="3" VerticalAlignment="Center">MyLabel</Label>
  <TextBox Margin="3" Width="100" VerticalAlignment="Center">MyText</TextBox>
</StackPanel>

Ответ 4

Я знаю, что это старый ответ, но вот пример для тех, кто ищет другой путь, где вам не нужно полагаться на фиксированную ширину текстового поля:

Вместо StackPanel используйте DockPanel и .Dock.

Это очень удобно при использовании внутри сетки.

<DockPanel Grid.Column="2" Grid.Row="2">
     <Label Content="SomeTitle:" DockPanel.Dock="Left"></Label>
     <TextBox x:Name="SomeValueTextBox" VerticalAlignment="Center" DockPanel.Dock="Right"></TextBox>
</DockPanel>

Result