À l'aide de WPF, quel est le moyen le plus efficace de mesurer un grand nombre de chaînes courtes? Spécifiquement, je voudrais déterminer la taille d'affichage de chaque chaîne, donné le formatage uniforme (même police, taille, poids, etc.) et la largeur maximum que la chaîne peut occuper?Mesure de texte dans WPF
Répondre
La technique la plus bas niveau (et donc donnant le plus de possibilités pour les optimisations créatives) est d'utiliser GlyphRuns.
Il est pas très bien documenté, mais j'ai écrit un petit exemple ici:
http://smellegantcode.wordpress.com/2008/07/03/glyphrun-and-so-forth/
L'exemple fonctionne sur la longueur de la chaîne comme une étape nécessaire avant de le restituer.
Vous pouvez utiliser la propriété DesiredSize sur une zone de texte rendu pour obtenir la hauteur et la largeur
using System.Windows.Threading;
...
Double TextWidth = 0;
Double TextHeight = 0;
...
MyTextBox.Text = "Words to measure size of";
this.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new DispatcherOperationCallback(delegate(Object state) {
var size = MyTextBox.DesiredSize;
this.TextWidth = size.Width;
this.TextHeight = size.Height;
return null;
}
) , null);
Si vous avez un grand nombre de chaînes, il peut être plus rapide d'abord pré-calualte la hauteur et la largeur de chaque lettre et symbole indiviudal dans une police donnée, puis effectuez un calcul basé sur les caractères de chaîne. Cela peut ne pas être 100% exact à cause du crénage etc
C'est très simple et fait par la classe FormattedText! Essayez-le.
FormattedText n'est pas disponible dans UniversalWindows, aidez-moi! –
En WPF:
Rappelez-vous d'appeler mesure() sur le TextBlock avant de lire la propriété DesiredSize.
Si le TextBlock a été créé sur la volée, et non encore montré, vous devez appeler Mesure() Tout d'abord, comme ceci:
MyTextBlock.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
return new Size(MyTextBlock.DesiredSize.Width, MyTextBlock.DesiredSize.Height);
Dans Silverlight:
Pas besoin de mesurer.
return new Size(TextBlock.ActualWidth, TextBlock.ActualHeight);
Le code complet ressemble à ceci:
public Size MeasureString(string s) {
if (string.IsNullOrEmpty(s)) {
return new Size(0, 0);
}
var TextBlock = new TextBlock() {
Text = s
};
#if SILVERLIGHT
return new Size(TextBlock.ActualWidth, TextBlock.ActualHeight);
#else
TextBlock.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
return new Size(TextBlock.DesiredSize.Width, TextBlock.DesiredSize.Height);
#endif
}
- 1. Mesure de la largeur du texte en Qt
- 2. emballage de texte dans WPF lien
- 3. WPF CommandParameter dans la zone de texte
- 4. sur mesure Validator
- 5. Conversion d'unité de mesure
- 6. Remplacer le texte dans WPF Richtextbox
- 7. Alignement vertical du texte dans WPF TextBlock
- 8. Validation dans la zone de texte dans WPF
- 9. objets de mesure fileinfo.Length dans kbs
- 10. sur mesure MKAnnotationView Callout
- 11. wpf: Mousedoubleclick pour la zone de texte
- 12. WPF: comment capturer le texte sélectionné dans une zone de texte incorporée dans ListView
- 13. Définir le texte dans plusieurs zones de texte dans les cellules d'une grille en C# WPF
- 14. Mise en forme de texte WPF dans GridViewColumn
- 15. Zone de texte saisie semi-automatique dans WPF
- 16. Définir le focus dans la zone de texte WPF
- 17. DataBind à une zone de texte dans WPF
- 18. Comment lire la zone de texte. Valeur de texte d'un autre thread dans WPF?
- 19. Cellule de mesure Nib UITableView
- 20. Mesure du nombre de cycles
- 21. Copie d'un "texte" d'émoticône à partir d'une riche zone de texte montrant l'image dans wpf
- 22. Les zones de texte WPF sont trop grandes
- 23. wpf: Sélection du texte dans TextBox avec IsReadOnly = true?
- 24. Comment faire un astérisque avec le texte environnant dans WPF?
- 25. WPF RichTextBox ne supprime pas le texte
- 26. Ne pas inclure la taille du composant dans la mesure
- 27. Comment pouvez imprimer le fichier texte dans WPF
- 28. WPF: Dropdown d'un Combobox highlightes le texte
- 29. Set texte RTF en WPF RichTextBox contrôle
- 30. WPF UIElements Inline avec le texte "Adornments"
Même question sur les forums MSDN a de meilleures solutions: http://social.msdn.microsoft.com/Forums/en-US/wpf/ thread/a450b0aa-7086-4145-9eff-a779571b6187/ – srgstm