Como: Desenhar a borda de um texto
Na maioria dos casos, ao adicionar ornamentação a sequências de texto no seu aplicativo Windows Presentation Foundation (WPF), você está usando texto como um conjunto de caracteres distintos, ou glifos. Por exemplo, você pode criar um pincel de gradiente linear e aplicá-lo à propriedade Foreground de um objeto TextBox. Quando você exibir ou editar a caixa de texto, o pincel de gradiente linear será automaticamente aplicado ao conjunto de caracteres atual na string.
Exemplo de um pincel de gradiente linear aplicado a uma caixa de texto
No entanto, você também pode converter o texto em objetos Geometry, permitindo que você crie outros tipos de texto visualmente atrativo. Por exemplo, você pode criar um objeto Geometry com base no contorno de um string de texto.
Exemplo de um pincel de gradiente linear aplicado à geometria do contorno do texto
Quando o texto é convertido em um objeto Geometry ele não é mais um conjunto de caracteres — você não pode modificar os caracteres na sequência de texto. No entanto, você pode afetar a aparência do texto convertido modificando suas propriedades de "pincelada" e de preenchimento. A "pincelada", ou "traço", refere-se ao contorno do texto convertido; o preenchimento refere-se a área dentro o contorno do texto convertido.
Os exemplos a seguir ilustram várias maneiras de criar efeitos visuais, modificando a "pincelada" e o preenchimento do texto convertido.
Exemplo de definição de traço e preenchimento com diferentes cores.
Exemplo de um pincel de imagem aplicado ao traço
Também é possível modificar o retângulo da caixa delimitadora, ou o realce, do texto convertido. O exemplo a seguir ilustra uma maneira de criar efeitos visuais modificando a pincelada e o realce do texto convertido.
Exemplo de um pincel de imagem aplicado ao traço e destaque.
Observação: |
---|
Para obter a amostra de código completo do qual os exemplos de código a seguir foram extraídos, consulte Descrito exemplo de Controlarar do texto Personalizar. |
Exemplo
A chave para converter texto em um objeto Geometry é usar o objeto FormattedText. Depois de criar esse objeto, você pode usar os métodos BuildGeometry e BuildHighlightGeometry para converter o texto em objetos Geometry. O primeiro método retornará a geometria do texto formatado; o segundo método retornará a geometria da caixa delimitadora do texto formatado. O exemplo de código a seguir mostra como criar um objeto FormattedText e recuperar as geometrias do texto formatado e da caixa delimitadora.
/// <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 hightlight.
if (Highlight == true)
{
_textHighLightGeometry = formattedText.BuildHighlightGeometry(new System.Windows.Point(0, 0));
}
}
Para exibir os objetos Geometry recuperados você precisa acessar o DrawingContext do objeto que está exibindo o texto convertido. Nesses exemplos de código, isso é feito criando um objeto controle personalizado que é derivado de uma classe que ofereça suporte a renderização definida pelo usuário. Para obter detalhes sobre como criar um controle personalizado, consulte Descrito exemplo de Controlarar do texto Personalizar.
Para exibir objetos Geometry no controle personalizado, sobrescreva o método OnRender. O método sobrescrito deve usar o método DrawGeometry para desenhar os objetos 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);
}
}
Consulte também
Tarefas
Descrito exemplo de Controlarar do texto Personalizar