2011-04-30 30 views
11

Me gustaría modificar el espaciado entre caracteres en un WPF TextBox.
Algo como el letter-spacing: 5px cosa que está disponible en CSS.
Creo que es posible en XAML; ¿Cuál es la manera más simple?¿Cómo puedo especificar el espaciado entre letras o el kerning en un WPF TextBox?

Encontré el documento "Introduction to the GlyphRun Object and Glyphs Element", y encontré que era excesivamente inútil.

Este es un ejemplo de código de esa página:

<!-- "Hello World!" with explicit character widths for proportional font --> 
<Glyphs 
    FontUri    = "C:\WINDOWS\Fonts\ARIAL.TTF" 
    FontRenderingEmSize = "36" 
    UnicodeString  = "Hello World!" 
    Indices    = ",80;,80;,80;,80;,80;,80;,80;,80;,80;,80;,80" 
    Fill    = "Maroon" 
    OriginX    = "50" 
    OriginY    = "225" 
/> 

La misma página de documentación da esta "explicación" de lo que hace la propiedad Indices:

enter image description here

no tengo ni idea de lo cualquiera de eso significa. Tampoco estoy seguro de que Índices sea lo correcto: el comentario en el código habla de "anchos de caracteres" que no me importan. Quiero ajustar el ancho entre caracteres.

Además, no hay ningún ejemplo de cómo aplicar un elemento Glyphs a un TextBox. Cuando lo probé, mi aplicación de prueba WPF simplemente se colgó.


Lo que quiero hacer es aumentar ligeramente el espacio vacío que aparece entre los personajes dibujados dentro de un cuadro de texto WPF. El texto variará en longitud y contenido. ¿Debo modificar la propiedad Indicies cada vez que hay un nuevo personaje? ¿Hay alguna manera de decir "hacer un 20% más de espacio de lo habitual para cada personaje"?

¿Alguien me puede ayudar?

Respuesta

14

Probé Glyphs y FontStretch y no pude obtener fácilmente el resultado que estaba buscando. Pude proponer un enfoque que funciona para mis propósitos. Quizás también funcionará para otros.

<ItemsControl ItemsSource="{Binding SomeString}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding}" 
         Margin="0,0,5,0"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Puedo enlazar a cualquier cadena y no es necesario hacer ninguna detección de ancho de caracteres para establecer correctamente el espaciado. El margen derecho es el espacio entre las letras.

Ejemplo:

Kerning

+0

Esta es una buena solución (ya lo voté), pero esto definitivamente puede causar problemas de rendimiento. Usamos esta solución en algunos lugares, pero queríamos usarla en un 'ItemsControl' con unos cientos de artículos y estaba agregando varios segundos al tiempo de renderizado. Volvimos a un 'TextBlock' normal en esos escenarios. ¡Así que ten en cuenta/cuidado! –

+0

Esto también romperá la capacidad de recortar o ajustar el texto. – Walkor

0

es FontStretch una opción para usted?

De lo contrario, es posible que desee buscar en this hay una imagen, que muestra lo que significa el ancho de avance. ¡Aunque no he hecho esto antes y no sé si esto funciona, aumentar los rodamientos del lado derecho e izquierdo podría ser lo que quieres!

-1

Por lo que su valor. . .

Si tiene la opción de cambiar su implementación a RichTextBox, esto podría ser más fácil que la solución que encontró en septiembre de 2013. Lo intenté solo para mis propias necesidades y funciona para lo que necesito. No veo una manera con RichTextBox para controlar el interletraje de espacios individuales como lo hacen los tipográficos. Pero TextBox estaba comiendo espacios adicionales (consolidando múltiples espacios adyacentes en un solo espacio) como HTML.Necesitaba que los espacios mostraran la misma cantidad de espacio que en mi cadena de texto, y RichTextBox hace esto.

<RichTextBox x:Name="MyRichTextBox"></RichTextBox> 

No soy un experto, pero parece que no puede especificar el contenido de texto en XAML. Tuve que especificarlo en un evento de código subyacente:

this.MyRichTextBox.AppendText("V A R I E D  S P A C E S"); 
Cuestiones relacionadas