Question

Je le rendu de texte à l'aide FormattedText, mais il ne semble pas être un moyen d'effectuer un test de par-char sur la sortie rendue. Il est en lecture seule, donc je ne fondamentalement besoin de sélection, pas d'édition.

J'utilise RichTextBox ou similaire, mais je dois texte de sortie en fonction des codes de contrôle embed dans la texte lui-même, de sorte qu'ils ne sont pas toujours nid, ce qui rend la construction des bons éléments Inline très complexe. Je suis aussi un peu inquiet au sujet de la performance de cette solution; J'ai un grand nombre de lignes et de nouvelles lignes sont ajoutées souvent.

Je l'ai regardé GlyphRun, il semble que je pourrais être touché-test de celui-ci ou une classe connexe, mais je serais réimplémentant beaucoup de fonctionnalités, et il semble qu'il devrait y avoir un moyen plus simple ...

Quelqu'un sait-il d'une bonne façon de mettre en œuvre cela?

Était-ce utile?

La solution

La meilleure façon est de concevoir une bonne structure de données pour stocker votre texte et qui prend en compte également les essais touchés. Un exemple pourrait être de diviser le texte en blocs (mots, des lignes ou des paragraphes en fonction de ce que vous avez besoin). Ensuite, chaque bloc doit avoir une zone de délimitation qui devrait être recalculé dans toutes les opérations de mise en forme. Voir également les positions caret dans votre conception.

Une fois que vous avez une telle installation, il devient très facile à faire-test a frappé, il suffit d'utiliser les boîtes englobantes. Il aidera également dans les opérations ultérieures comme mettant en évidence une partie particulière du texte.

Autres conseils

Vous pouvez obtenir la géométrie de chaque caractère d'un objet FormattedText et utiliser les limites de chaque personnage pour faire votre test de recherche.

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++;
}

Dans OnRender vous pouvez rendre ces objets géométriques au lieu du texte formaté.

Entièrement d'accord avec Sesh - la meilleure façon que vous allez sortir sans re-mettre en œuvre une charge toute la fonctionnalité FormattedText va être en divisant les éléments individuels que vous voulez frapper test dans leurs propres contrôles / inline.

Pensez à utiliser un TextBlock et en ajoutant chaque mot comme son propre ligne (ou), puis soit se lient à la propriété IsMouseDirectlyOver de la ligne, nos délégués se ajoutent aux événements MouseEnter & MouseLeave.

Si vous voulez faire des tests de recherche au niveau des pixels des Glyphes réels (c.-à-est la souris exactement au point de ce « i »), alors vous aurez besoin d'utiliser GlyphRuns et faire un test de recherche manuel sur les Glyphes ( lire:. travail)

Je suis très en retard à la partie - si la partie n'est pas terminée, et vous n'avez pas besoin de la géométrie du caractère réel, j'ai trouvé quelque chose comme cela utile:

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

BuildGeometry () ne comprend que la géométrie de la trajectoire réelle d'un caractère. BuildHighlightGeometry () génère les limites extérieures de tous les caractères - y compris les espaces, de sorte qu'un index dans un espace peuvent être localisés par:

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

Hope this helps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top