Практическое руководство. Создание контурного текста
В большинстве случаев при добавлении декоративных элементов в текстовые строки в вашей Windows Presentation Foundation (WPF) приложения, вы используете текст в виде коллекции дискретных символов или глифов. Например, можно создать кисть линейного градиента и применить его к Foreground свойство TextBox объекта. При отображении или измените текстовое поле, кисти линейного градиента применяется автоматически в текущий набор символов в текстовой строке.
Тем не менее, можно также преобразовать текст в Geometry объектами, позволяет создавать другие типы визуально форматированного текста. Например, можно создать Geometry объект, основанный на контуре строки текста.
Если текст преобразуется в Geometry объекта, он больше не является набором символов — изменение символов в текстовой строке невозможно. Тем не менее можно повлиять на внешний вид преобразованного текст, изменив его свойства штриха и заливки. Штрих — это контур преобразованного текста; заливка — это область внутри контура преобразованного текста.
Следующие примеры иллюстрируют несколько способов создания визуальных эффектов посредством изменения штриха и заливки преобразованного текста.
Можно также изменить ограничивающий прямоугольник или выделения преобразованного текста. Следующий пример иллюстрирует способ создания визуальных эффектов посредством изменения штриха и выделения преобразованного текста.
Пример
Ключ, чтобы преобразовать текст в Geometry объекта заключается в использовании FormattedText объекта. После создания этот объект можно использовать BuildGeometry и BuildHighlightGeometry методы, чтобы преобразовать текст в Geometry объектов. Первый метод возвращает геометрию форматированного текста. Второй метод возвращает ограничивающий прямоугольник геометрии форматированного текста. В следующем примере кода показано, как создать FormattedText объекта и извлечение геометрических форм форматированного текста и его ограничивающего прямоугольника.
/// <summary>
/// Create the outline geometry based on the formatted text.
/// </summary>
public void CreateText()
{
System.Windows.FontStyle fontStyle = FontStyles.Normal;
FontWeight fontWeight = FontWeights.Medium;
if (Bold == true) fontWeight = FontWeights.Bold;
if (Italic == true) fontStyle = FontStyles.Italic;
// Create the formatted text based on the properties set.
FormattedText formattedText = new FormattedText(
Text,
CultureInfo.GetCultureInfo("en-us"),
FlowDirection.LeftToRight,
new Typeface(
Font,
fontStyle,
fontWeight,
FontStretches.Normal),
FontSize,
System.Windows.Media.Brushes.Black // This brush does not matter since we use the geometry of the text.
);
// Build the geometry object that represents the text.
_textGeometry = formattedText.BuildGeometry(new System.Windows.Point(0, 0));
// Build the geometry object that represents the text highlight.
if (Highlight == true)
{
_textHighLightGeometry = formattedText.BuildHighlightGeometry(new System.Windows.Point(0, 0));
}
}
Чтобы отобразить извлеченные Geometry объектов, необходимо получить доступ к DrawingContext объекта, который отображает преобразованный текст. В этих примерах кода это делается путем создания объекта пользовательского элемента управления, производный от класса, поддерживающего пользовательской отрисовки.
Для отображения Geometry объектов в пользовательском элементе управления, переопределите для OnRender метод. Переопределенный метод должен использовать DrawGeometry метод для отображения Geometry объектов.
/// <summary>
/// OnRender override draws the geometry of the text and optional highlight.
/// </summary>
/// <param name="drawingContext">Drawing context of the OutlineText control.</param>
protected override void OnRender(DrawingContext drawingContext)
{
// Draw the outline based on the properties that are set.
drawingContext.DrawGeometry(Fill, new System.Windows.Media.Pen(Stroke, StrokeThickness), _textGeometry);
// Draw the text highlight based on the properties that are set.
if (Highlight == true)
{
drawingContext.DrawGeometry(null, new System.Windows.Media.Pen(Stroke, StrokeThickness), _textHighLightGeometry);
}
}
Источник объекта пример настраиваемого пользовательского элемента управления, см. в разделе OutlineTextControl.cs для C# и OutlineTextControl.vb для Visual Basic.