2012-07-12 20 views
10

¿Hay alguna posibilidad de ofrecer una sugerencia de ajuste de línea a un Textblock como se puede hacer en HTML con <SHY> (soft hyphen) o <WBR> (word break) o la aún más complicado y menos mantenible zero-width-space &#8203;envolver en TextBlock

Por el momento se rompe la caja tipográfica palabras del mismo modo que ve la necesidad, terminando con la palabra envuelve como

Stackoverflo
w

lo que quiero es:

Stackover-
flujo

o al menos:

Stackover
flujo

Si hay maneras recomendadas de lograr lo que se necesita, házmelo saber.

Respuesta

4

Configuración TextBlock.IsHypenationEnabled a ciertos, en realidad hacer algo similar a eso, pero si desea utilizar las etiquetas, se puede utilizar un método como este:

/// <summary> 
    /// Adds break to a TextBlock according to a specified tag 
    /// </summary> 
    /// <param name="text">The text containing the tags to break up</param> 
    /// <param name="tb">The TextBlock we are assigning this text to</param> 
    /// <param name="tag">The tag, eg <br> to use in adding breaks</param> 
    /// <returns></returns> 
    public string WordWrap(string text, TextBlock tb, string tag) 
    { 
     //get the amount of text that can fit into the textblock 
     int len = (int)Math.Round((2 * tb.ActualWidth/tb.FontSize)); 
     string original = text.Replace(tag, ""); 
     string ret = ""; 
     while (original.Length > len) 
     { 
      //get index where tag occurred 
      int i = text.IndexOf(tag); 
      //get index where whitespace occurred 
      int j = original.IndexOf(" "); 
      //does tag occur earlier than whitespace, then let's use that index instead! 
      if (j > i && j < len) 
       i = j; 
      //if we usde index of whitespace, there is no need to hyphenate 
      ret += (i == j) ? original.Substring(0, i) + "\n" : original.Substring(0, i) + "-\n"; 
      //if we used index of whitespace, then let's remove the whitespace 
      original = (i == j) ? original.Substring(i + 1) : original.Substring(i); 
      text = text.Substring(i + tag.Length); 
     } 
     return ret + original; 
    } 

esta manera Ahora puede decir:

textBlock1.Text = WordWrap("StackOver<br>Flow For<br>Ever", textBlock1, "<br>"); 

This seria:

Just tested

Sin embargo, sólo con IsHyphenated sin etiquetas, será:

IsHypehnated Scenario1

bien:

textBlock1.Text = WordWrap("StackOver<br>Flow In<br> U", textBlock1, "<br>"); 

la Salida:

Doesn't add <brs> here

Y IsHyphenated sin tags:

IsHyphenated Scenario 2

EDIT: en la reducción de tamaño de la fuente, he descubierto que el primer código que he publicado no prefieren añadir pausas, donde los espacios en blanco se producen a roturas especificados por el usuario.

+0

¡Gracias! Esto se ve exactamente como lo que quiero. Tienes que probarlo antes de aceptarlo. –

+0

Funciona bien, solo tuve que hacer dos cambios menores: 1. textBlock1 se reemplaza por el parámetro tb 2. // obtener el índice donde se produjo la etiqueta int i = text.IndexOf (tag); if (i <0) { return ret + text; } –

+0

Gracias, de hecho pensé que había actualizado esto ... En cuanto a verificar si la etiqueta existe, no es necesario si la está usando solo para los textos que necesitan la etiqueta, también si desea que todos sus TextBlocks tengan este característica, debe hacer un control personalizado y anular la propiedad de cambio de texto ... –

3

Utilice el TextFormatter junto con un TextSource personalizado para controlar cómo se divide y envuelve el texto.

Necesitas derivar una clase de TextSource y en su aplicación analizar su contenido/cuerda y proporcionar a sus normas de embalaje, por ejemplo buscando su etiqueta <wbr> ... cuando veas una etiqueta, devuelves TextEndOfLine si no devuelves TextCharacters.

Un ejemplo que podría ayudar en la implementación de un TextSource está aquí:

Para un ejemplo muy avanzada vistazo a "AvalonEdit", que también lo utiliza:

También puede investigar GlyphRun si no necesita un formato enriquecido.

+0

¡Esos ejemplos son muy buenos! +1 Aunque, debe haber una manera más fácil de hacer esto. Tal vez un cuadro de texto de envoltura que entiende un guión suave o algo así. –

+0

Puede usar un RichTextBox y luego proporcionar RTF adecuadamente definido. –

+0

Parece una buena idea, tiene que encontrar cómo funciona. –