2010-09-17 9 views
2

Ceci est une question légèrement abstraite, pour laquelle je suis désolé. Je ne recherche pas forcément une solution testée spécifique, mais plutôt quelques suggestions que je peux expérimenter pour trouver celle qui fonctionne le mieux. Toutes les suggestions sont les bienvenues - les plus variées et créatives seront les meilleures.Comment frapper les caractères individuels dans un TextBlock Silverlight

Voici le problème:

J'ai Silverlight TextBlock qui contient un paragraphe de texte d'emballage. Il peut contenir plusieurs exécutions avec une variété de mise en forme appliquée, y compris plusieurs tailles de police. Il peut être aligné à gauche, à droite, au centre ou justifié et peut contenir des exécutions utilisant un flux de texte de droite à gauche. Je dois être capable de détecter le personnage sous le pointeur de la souris. Dans WPF, je pourrais résoudre ce problème facilement en utilisant la méthode GetPositionFromPoint, mais comme cette méthode n'existe pas dans Silverlight, j'ai besoin d'une solution de contournement créative. Une approche que j'ai essayé, avec un succès raisonnable, est de diviser le texte en mots individuels et de créer un TextBlock pour chacun d'entre eux. En les rendant dans un WrapPanel, je peux identifier la position de départ de chaque mot et ainsi rétrécir la zone de test. La recherche du caractère cible réel consiste alors à construire le mot cible, caractère par caractère, jusqu'à ce que sa largeur rencontre la position de la souris. Bien que ma technique expérimentale fonctionne, elle a deux inconvénients. Le premier est la performance, car il est coûteux de rendre un grand nombre d'instances individuelles dans un WrapPanel. La deuxième préoccupation est que mon algorithme de rupture de ligne (basé grossièrement sur les espaces et les traits d'union) peut ne pas correspondre exactement à celui utilisé par le TextBlock réel utilisé dans l'interface utilisateur. Après avoir lu le Unicode Line Breaking Algorithm, je me rends compte que c'est un sujet entier en soi. Je ne veux pas risquer un design qui casse sous certaines conditions de contenu de paragraphe

J'aimerais idéalement trouver une technique qui me permette de mesurer directement par rapport au TextBlock principal, mais je salue toute suggestion innovante, aussi bizarre soit-elle ils peuvent apparaître.

Un grand merci, Tim

Répondre

2

Utilisez un RichTextBox à la place, qui a une méthode GetPositionFromPoint.

+0

Merci - J'ai accepté votre réponse. Il est contre-intuitif d'utiliser un tel contrôle lourd pour une opération aussi légère mais, comme je le découvre de plus en plus, Silverlight nous force parfois à adopter des solutions de contournement inopportunes. –

+0

@Tim: "Forces" ... "Inconvénient". Léger = Moins de fonctionnalités. Si vous voulez plus de fonctionnalités, vous avez besoin de quelque chose avec un poids plus important. Silverlight est tout au sujet du compromis entre la taille et les caractéristiques globales de téléchargement. – AnthonyWJones