Выровняйте нижние части текста в средствах управления

Следующий отрывок:


    
                    
            
    

Представляет следующее:
alt text

Есть ли какой-либо способ, которым я могу установить в стилях Маркировок так, чтобы их текстовые нижние части были выровненные?
У меня есть тот же вопрос с TextBlocks также.

Примечание: так как я боролся с этой проблемой некоторое время, отправьте только certains, отвечает, что Вы знаете ту работу.
Я уже попробовал: VerticalAlignment, VerticalContentAlignment, Дополнение, Поле. Есть ли что-либо еще, о чем я не знаю?

Я прочитал это сообщение, но оно не говорит о сценарии другого размера шрифта.

ОБНОВЛЕНИЕ: проблема, это, даже Дополнение установлено на 0 существует все еще неопределенное пространство вокруг шрифта в области ContentPresenter. это пространство варьируется на размере шрифта. Если бы я мог бы управлять этим пространством, я был бы в лучшей ситуации.

Спасибо

17
задан Community 23 May 2017 в 11:46
поделиться

3 ответа

Нет решения только для XAML, вы должны использовать код позади. Также даже с кодом позади нет общего решения для этого, потому что, если ваш текст многостроен? Какой базовый уровень должен использоваться в этом случае? Или что, если в вашем шаблоне есть несколько текстовых элементов? Такой, как заголовок и контент, или больше, какой базовый уровень тогда?

Короче говоря, ваша лучшая ставка состоит в том, чтобы выровнять текст вручную, используя верхние / нижние поля.

Если вы готовы сделать предположение, что у вас есть один текстовый элемент, вы можете выяснить расстояние пикселя базовой линии от верхней части элемента путем создания форматтекста объекта со всеми те же свойства существующего текстового элемента. Объект форматытектук имеет двойной базовый уровень , который содержит это значение. Обратите внимание, что вам все равно придется вручную вводить в маржу, потому что элемент может не сидеть точно против верхней или нижней части своего контейнера.

Смотрите этот пост форума MSDN: Базовый уровень TextBox

Вот метод, который я писал, что извлекает это значение. Он использует отражение для получения соответствующих свойств, поскольку они не распространены ни одному базовым классам (они определяются отдельно на Control , TextBlock , , ] TextElement и, может быть, другие).

public double CalculateBaseline(object textObject)
{
    double r = double.NaN;
    if (textObject == null) return r;

    Type t = textObject.GetType();
    BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public;

    var fontSizeFI = t.GetProperty("FontSize", bindingFlags);
    if (fontSizeFI == null) return r;
    var fontFamilyFI = t.GetProperty("FontFamily", bindingFlags);
    var fontStyleFI = t.GetProperty("FontStyle", bindingFlags);
    var fontWeightFI = t.GetProperty("FontWeight", bindingFlags);
    var fontStretchFI = t.GetProperty("FontStretch", bindingFlags);

    var fontSize = (double)fontSizeFI.GetValue(textObject, null);
    var fontFamily = (FontFamily)fontFamilyFI.GetValue(textObject, null);
    var fontStyle = (FontStyle)fontStyleFI.GetValue(textObject, null);
    var fontWeight = (FontWeight)fontWeightFI.GetValue(textObject, null);
    var fontStretch = (FontStretch)fontStretchFI.GetValue(textObject, null);

    var typeFace = new Typeface(fontFamily, fontStyle, fontWeight, fontStretch);

    var formattedText = new FormattedText(
        "W", 
        CultureInfo.CurrentCulture, 
        FlowDirection.LeftToRight, 
        typeFace, 
        fontSize, 
        Brushes.Black);

    r = formattedText.Baseline;

    return r;
}

Редактировать: Shimmy, в ответ на ваш комментарий, я не верю, что вы на самом деле попробовали это решение, потому что он работает. Вот пример:

Example Baseline Alignment

Вот XAML:

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Margin" Value="0,40,0,0"/>
        </Style>
    </StackPanel.Resources>
    <StackPanel Orientation="Horizontal">
        <TextBlock Name="tb1" Text="Lorem " FontSize="10"/>
        <TextBlock Name="tbref" Text="ipsum"/>
    </StackPanel>
    <StackPanel Orientation="Horizontal">
        <TextBlock Name="tb2" Text="dolor "  FontSize="20"/>
        <TextBlock Text="sit"/>
    </StackPanel>
    <StackPanel Orientation="Horizontal">
        <TextBlock Name="tb3" Text="amet "  FontSize="30"/>
        <TextBlock Text="consectetuer"/>
    </StackPanel>
</StackPanel>

, а вот код, стоящий за тем, что достигает этого

double baseRef = CalculateBaseline(tbref);
double base1 = CalculateBaseline(tb1) - baseRef;
double base2 = CalculateBaseline(tb2) - baseRef;
double base3 = CalculateBaseline(tb3) - baseRef;
tb1.Margin = new Thickness(0, 40 - base1, 0, 0);
tb2.Margin = new Thickness(0, 40 - base2, 0, 0);
tb3.Margin = new Thickness(0, 40 - base3, 0, 0);
6
ответ дан 30 November 2019 в 11:22
поделиться

Я на самом деле нашел простой ответ на основе Aviad .

Я создал конвертер, который содержит функцию Aviad, которая принимает сам элемент и возвращает вычисляемую толщину.

Затем я настроил

<Style TargetType="TextBlock">
    <Setter Property="Margin" 
        Value="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource converters:TextAlignmentMarginConverter}}" />
</Style>

Недостатком состоит в том, что это, очевидно, занимает исходное свойство маржина, поскольку у текстового блока нет шаблона, поэтому мы не можем установить его через TemplateBinding.

0
ответ дан 30 November 2019 в 11:22
поделиться

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

<TextBlock>
   <Run FontSize="20">What</Run>
   <Run FontSize="36">ever</Run>
   <Run FontSize="12" FontWeight="Bold">FontSize</Run>
</TextBlock>

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

Беги не будет исправлять выравнивание меток и их текстовых ящиков, но для многих простых ситуаций пробег будет делать довольно красиво.

6
ответ дан 30 November 2019 в 11:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: