WPF: выравнивание базовой линии надписи и ее TextBox - PullRequest
29 голосов
/ 14 июня 2010

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

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

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

result

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

Ответы [ 4 ]

32 голосов
/ 14 июня 2010

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

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

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

20 голосов
/ 14 июня 2010

Что вы думаете?

alt text

<StackPanel Orientation="Horizontal">
        <Label Margin="3" VerticalContentAlignment="Center">MyLabel</Label>
        <TextBox Margin="3" VerticalContentAlignment="Center" Width="100">MyText</TextBox>
 </StackPanel>
4 голосов
/ 14 июня 2010

Я добился этого взгляда в Кахамле с помощью:

<StackPanel Orientation="Horizontal">
  <Label Margin="3" VerticalAlignment="Center">MyLabel</Label>
  <TextBox Margin="3" Width="100" VerticalAlignment="Center">MyText</TextBox>
</StackPanel>
2 голосов
/ 31 января 2018

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

Вместо 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

...