¿Qué es una buena manera de realizar pruebas de posicionamiento en un FormattedText?

StackOverflow https://stackoverflow.com/questions/540002

  •  22-08-2019
  •  | 
  •  

Pregunta

Estoy prestando texto usando FormattedText, pero sí parece haber ninguna manera de realizar la prueba de posicionamiento por-char en la salida procesada. Es de sólo lectura, por lo que, básicamente, sólo necesita la selección, sin edición.

que haría uso de RichTextBox o similar, pero necesito texto de salida basado en el control de los códigos de integrar en el propio texto, por lo que no siempre nido, lo que hace que la construcción de los elementos Inline derecha muy complejo. También estoy un poco preocupado por el rendimiento con esa solución; Tengo un gran número de líneas, y las nuevas líneas se anexan a menudo.

He mirado en GlyphRun, parece que podría conseguir golpeado pruebas de ella o una clase relacionada, pero estaría reimplementar una gran cantidad de funcionalidad, y parece que debe haber una manera más sencilla ...

¿Alguien sabe de una buena forma de implementar esto?

¿Fue útil?

Solución

La mejor manera es diseñar una buena estructura de datos para almacenar el texto y que también considera pruebas golpeado. Un ejemplo podría ser la de dividir el texto en bloques (palabras, líneas o párrafos en función de lo que necesita). Entonces cada uno de tales bloque debe tener un cuadro delimitador que debe ser vuelve a calcular en cualquier operación de formato. Ten en cuenta también las posiciones de intercalación en su diseño.

Una vez que tenga dicha instalación se hace muy fácil de hacer golpear-prueba, sólo tiene que utilizar los cuadros delimitadores. También ayudará en las operaciones posteriores al igual que destaca una porción particular del texto.

Otros consejos

Usted puede obtener la geometría de cada personaje de un objeto FormattedText y el uso de los límites de cada personaje para hacer su prueba de posicionamiento.

var geometry = (GeometryGroup)((GeometryGroup)text.BuildGeometry(new Point(0, 0))).Children[0];
foreach (var c in geometry.Children)
{
  if (c.Bounds.Contains(point))
    return index;
  index++;
}

En OnRender puede hacer que estos objetos en lugar de la geometría del texto con formato.

completamente de acuerdo con Sesh - la forma más fácil que van a salirse con no volver a implementar toda una carga de funcionalidad FormattedText va a ser mediante la división de los elementos individuales que desea golpear la prueba en sus propios controles / inlines.

Considere el uso de un TextBlock y la adición de cada palabra, ya que es propia línea (o), entonces o bien se unen a la propiedad IsMouseDirectlyOver de la línea, nuestros delegados añadir a los eventos MouseEnter y MouseLeave.

Si usted quiere hacer a nivel de píxeles prueba de posicionamiento de los glifos reales (es decir, es el ratón exactamente en el punto de esta 'i'), entonces usted tendrá que utilizar GlyphRuns y hacer pruebas de posicionamiento manual de los glifos ( léase:. arduo trabajo)

Estoy muy tarde a la fiesta - si el partido no ha terminado, y que no necesita la geometría de carácter real, me encontré con algo como esto útil:

 for (int i = 0; i < FormattedText.Text.Length; i++)
 {
            characterHighlightGeometry = FormattedText.BuildHighlightGeometry(new Point(), i, 1);
            CharacterHighlightGeometries.Children.Add(characterHighlightGeometry);
 }

BuildGeometry () sólo incluye la geometría de la trayectoria real de un personaje. BuildHighlightGeometry () genera los límites exteriores de todos los personajes - incluyendo espacios, por lo que un índice para un espacio pueden ser localizados por:

 foreach (var c in CharacterHighlightGeometries.Children)
        {
            if (c.Bounds.Contains(centerpoint))
            {
                q = c;
                cpos = index;
                break;
            }
            index++;
        }

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top