2009-10-18 5 views
1

Я пытаюсь сделать строку звездочки вертикально с окружающим текстом/графикой, а не над ней.Как создать строку звездочки с окружающим текстом в WPF?

Я думал, что применение отрицательного BaselineOffset было бы решением, но, похоже, оно не имеет никакого эффекта.

Вот документация собственности TextBlock.BaselineOffset:

Свойство Значение Тип: System.Double

Величина, на которую каждая строка текста смещена от базовой линии, в устройстве независимые пиксели. Double.NaN указывает, что оптимальное смещение базовой линии автоматически рассчитывается из текущих характеристик шрифта. По умолчанию используется Double.NaN.

Примечание

Базовая линия является воображаемой горизонтальной линией, с которой основание каждого символа в> строка текста выравнивается.

Пример разметки:

<TextBlock 
    Name="ReadUnreadIndicator" 
    Grid.Column="0" 
    VerticalAlignment="Center" 
    FontWeight="Bold" 
    FontSize="24" 
    BaselineOffset="-10" 
    Text="*" /> 

Независимо от того, что я ставлю на BaselineOffset, звездочка всегда появляется "верхний индекс".

Вопросы:

  1. Почему не BaselineOffset работает для меня? Я использую это неправильно или это ошибка в рамках?

  2. Как перенести звездочку вниз без использования поля (что создаст пространство над TextBlock, которое я не хочу)?

ответ

2

Вот что я в конечном итоге происходит с:

<TextBlock 
    Name="ReadUnreadIndicator" 
    Grid.Column="0" 
    Margin="0,5,0,-5" 
    FontSize="24" 
    FontWeight="Bold" 
    Text="*" /> 

Благодаря @Martin & @Gimalay за помощь.

6

Насколько я знаю TextBlock.BaselineOffset влияет только TextBlock внутри другого TextBlock:

<TextBlock>Some text <TextBlock BaseLineOffset="10" Text="*"/></TextBlock> 

Регулировка BaseLineOffset позволяет перемещать звездочку вертикально по отношению к «Some Text». Обратите внимание, что значение по умолчанию BaseLineOffset, обозначенное Double.NaN, отличается от 0, и вам, вероятно, потребуется положительное смещение, чтобы избежать смещения звездочки слишком далеко вниз.

Но, как вы указали в своем комментарии, используя BaseLineOffset, это не очень хорошее решение. Проблема заключается в том, что символ звездочки не по вашему желанию. Я бы предположил, что вы переключитесь на свой собственный глиф, нарисованный в WPF, с правильным размещением и внешним видом, а затем разместите рядом с текстом, используя что-то вроде StackPanel, чтобы выровнять их.

+0

Спасибо, это определенно правильный ответ на мой первый вопрос, но он по-прежнему заканчивается тем, что создает дополнительное пространство, что делает общий уровень TextBlock выше. – devuxer

+0

Вы можете использовать margin как «0,1,0, -1». – gimalay

+0

@ Гималаи, вот и все! – devuxer

0

Это кажется выровнять звездочку правильно:

<TextBlock 
    Grid.Column="0"> 
    <TextBlock 
     Name="ReadUnreadIndicator" 
     BaselineOffset="30" 
     FontFamily="Courier New" 
     FontSize="24" 
     FontWeight="Bold" 
     Text="٭" /> 
</TextBlock> 

Text на самом деле является «арабская Пятиконечная Звезда» (U + 066D), а не звездочки, но это выглядит очень похоже.

Я понятия не имею, почему BaselineOffset должно быть «30» для правильной работы. Он явно не перемещает текст на 30 пикселей - он перемещает его, возможно, на 2 или 3 пикселя.

+0

В вашем случае по умолчанию 'BaseLineOffset', возможно, 33 и опускает его до 30, перемещает звездочку немного вниз. По умолчанию 'BaseLineOffset' вычисляется из шрифта, устанавливая' BaseLineOffset' в 'Double.NaN'. 0 обычно не является «нейтральным» или значением по умолчанию. –

+0

@ Мартин, Это объяснило бы. Ну, почти. Одна вещь, которую я заметил: установка «BaselineOffset» где-то между 0 и 25 и никакого эффекта вообще. Однако даже очень небольшой отрицательный эффект «BaselineOffset» имел эффект. Можете ли вы объяснить, почему это было бы? – devuxer

Смежные вопросы