TextBlock размером с заглавную букву (без учета шрифта ascender / descender) - PullRequest
7 голосов
/ 20 марта 2012

Я хочу получить определенное поведение на TextBlock, чтобы его высота включала только высоту заглавных букв (от базовой линии до верхней части минус «высота по возрастанию»). Пожалуйста, посмотрите изображение Sphinx из Википедии , чтобы понять, что я имею в виду. Также изображение ниже может лучше показать, что я хочу.

Sample enter image description here

Я специально не ищу чистого решения XAML (возможно, невозможного), поэтому код C # (конвертер) тоже подойдет.

Это XAML, используемый в XamlPad для получения левой буквы A на изображении выше.

<TextBlock Text="A" Background="Aquamarine" FontSize="120" HorizontalAlignment="Center" VerticalAlignment="Center" />

Ответы [ 2 ]

4 голосов
/ 08 апреля 2013

Вы можете попытаться использовать атрибут LineStackingStrategy = "BlockLineHeight", а также конвертер для атрибутов LineHeight и конвертер для высоты TextBlock.Это пример кода преобразователей

// Height Converter
public class FontSizeToHeightConverter : IValueConverter
{
    public static double COEFF = 0.715;
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (double)value * COEFF;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
// LineHeightConverter
public class FontSizeToLineHeightConverter : IValueConverter
{
    public static double COEFF = 0.875;
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return double.Parse(value.ToString()) * COEFF;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Коэффициент, используемый на преобразователях, зависит от используемых семейств шрифтов (Baseline и LineSpacing):

<TextBlock Text="ABC" Background="Aqua" LineStackingStrategy="BlockLineHeight" 
FontSize="{Binding ElementName=textBox1, Path=Text}" 
FontFamily="{Binding ElementName=listFonts, Path=SelectedItem}" 
Height="{Binding RelativeSource={RelativeSource Self}, Path=FontSize, Mode=OneWay, Converter={StaticResource FontSizeToHeightConverter1}}"
LineHeight="{Binding RelativeSource={RelativeSource Self}, Path=FontSize, Converter={StaticResource FontSizeToLineHeightConverter}}"/>

sample with params Coeff = 0.7

Лучшее решение состоит в том, чтобы найти способ расчета Coeff на основе параметров Baseline и LineSpacing из FontFamily.В этом примере (пользовательский интерфейс Segeo) Coeff of Height = 0,715 и LineHeight = 0,875 * FontSize.

1 голос
/ 20 марта 2012

Обновлен:

Если я правильно понимаю, для этого есть несколько хитростей,

Вы можете Scale сделать это с помощью RenderTransform, который обычно является наиболее эффективным способом;

<TextBlock Text="Blah">
  <TextBlock.RenderTransform>
   <CompositeTransform ScaleY="3"/>
  </TextBlock.RenderTransform>
</TextBlock>

Или вы можете встроить TextBlock в Viewbox, чтобы «масштабировать» текст, чтобы он соответствовал границам его контейнера, если, например, вы устанавливаете жесткие значения высоты в строках сетки, как;

<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="120"/>
<RowDefinition Height="120"/>
</Grid.RowDefinitions>
<Viewbox VerticalAlignment="Stretch" Height="Auto">
      <!-- The textblock and its contents are 
      stretched to fill its parent -->
      <TextBlock Text="Sphinx" />
</Viewbox>
<Viewbox Grid.Row="2" VerticalAlignment="Stretch" Height="Auto">
      <!-- The textblock and its contents are 
      stretched to fill its parent -->
      <TextBlock Text="Sphinx2" />
</Viewbox>

или вы можете привязать FontSize к элементу Container, как;

<Grid x:Name="MyText" Height="120">
<TextBlock FontSize="{Binding ElementName=MyText, Path=Height}" Text="Sphinx" />
</Grid>

Они могут представить эффект, который вы ищете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...