Текстовое содержимое в кнопке WPF не центрируется вертикально
Есть ли причина, по которой текстовое содержимое кнопки WPF появляется с нежелательным пространством над текстом?
У меня есть кнопка в StackPanel. Эта кнопка - простая кнопка закрытия, поэтому я хочу, чтобы она отображалась в виде квадратной кнопки с центрированной буквой "х". Я установил для своего отступа ноль и установил для HorizontalContentAlign и VerticalContentAlign значение Center, но символ "x" по-прежнему отображается в нижней части кнопки (или даже обрезается, если размер шрифта FontSize слишком велик относительно высоты). Как будто в верхней части кнопки есть отступы, которые не позволяют тексту использовать полный вертикальный пробел.
Мой XAML это:
<StackPanel Orientation="Horizontal">
<Label Content="{Binding GenderFilter.Title}" FontWeight="Bold" Width="60" />
<Button Padding="0" Width="15" Height="15" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="12">x</Button>
<Label Content="{Binding GenderFilterExpander.SelectedValue}" />
</StackPanel>
Проблема точно такая же, если я установлю для свойства кнопки VerticalContentAlign значение Stretch или даже Top. Если я удаляю свойства Высота и Вес, чтобы кнопка определяла свое собственное, тогда элемент управления отображается не в виде квадрата, а в виде вертикального прямоугольника, а "х" по-прежнему не центрируется.
ОБНОВЛЕНИЕ: несмотря на то, что кнопка и содержимое теперь идеально отцентрированы, кнопка по-прежнему отображается гораздо больше, чем нужно, как если бы применялось высокое заполнение.
Мое определение стиля ресурса теперь выглядит следующим образом:
<Style x:Key="ClearFilterButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Padding" Value="0" />
<Setter Property="Width" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=ActualHeight}" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Content" Value="X" />
<Setter Property="FontSize" Value="8" />
</Style>
Сама кнопка определяется как:
<Expander.Header>
<StackPanel Orientation="Horizontal">
<Label Content="{Binding GenderFilter.Title}" FontWeight="Bold" Width="60" />
<Button Style="{StaticResource ClearFilterButtonStyle}"
Visibility="{Binding GenderFilterExpander.ClearFilterVisibility}" />
<Label Content="{Binding GenderFilterExpander.SelectedValue}"
Visibility="{Binding GenderFilterExpander.SelectedValueVisibility}" />
</StackPanel>
</Expander.Header>
Расширитель находится внутри StackPanel внутри GroupBox в DockPanel.
В представлении конструктора кнопки имеют правильный размер, они содержат только X, но во время выполнения они увеличиваются. Как я могу это исправить?
2 ответа
Я предполагаю, что вы видите эту проблему, потому что существует конфликт между высотой, которую вы ей дали, и пространством, которое ему действительно нужно для правильной визуализации.
Что вы можете сделать, чтобы решить эту проблему:
- Поиграйте со свойством Padding кнопки. Это контролирует пространство между текстом и границами кнопки.
- Уменьшите размер шрифта.
- Не устанавливайте явную высоту на кнопке и, по крайней мере, не устанавливайте ее достаточно большой, чтобы она соответствовала нужному размеру шрифта и отступам.
Кроме того, как упомянул Хейнзи в комментариях, вы, конечно, должны использовать заглавную букву X.
Кстати, вот трюк, который вы можете использовать, если хотите, чтобы кнопка была квадратной, при этом убедитесь, что кнопка получает нужный ей размер.
<Button Padding="0"
Width="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=ActualHeight}"
HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
FontSize="12" Content="X" />
Это эффективно позволяет кнопке решить, какая высота ей нужна, а затем вы устанавливаете ширину на это вычисленное значение.
Простой способ сделать это с помощью строчной буквы "х" - это использовать TextBlock
как контент и игра со своим верхним полем:
<Button Command="{Binding myCommand}">
<TextBlock Text="x" Margin="0,-3,0,0"/>
</Button>