2009-05-26 4 views
1

Comment déterminez-vous la largeur du texte dans un TreeViewItem WPF au moment de l'exécution?Comment déterminez-vous la largeur du texte dans un TreeViewItem WPF au moment de l'exécution?

J'ai besoin de calculer un décalage afin que je puisse dessiner une ligne d'une feuille à la feuille d'un TreeView différent. Toutes les propriétés 'width' retournent une taille qui est plus grande que l'espace occupé par le texte réel du noeud. Cela doit être possible car la fonction Sélectionner ne met pas en évidence la ligne entière. J'écris le client dans WPF et Silverlight.

Répondre

0

J'ai deux solutions:

A) Utilise l'arbre visuel

TreeViewItem selected = (TreeViewItem)dataSourceTreeView.SelectedItem; 
    double textWidth = 0; 
    double expanderWidth = 0; 
    Grid grid = (Grid)VisualTreeHelper.GetChild(selected, 0); 

    ToggleButton toggleButton = (ToggleButton)VisualTreeHelper.GetChild(grid, 0); 
    expanderWidth = toggleButton.ActualWidth; 

    Border bd = (Border)VisualTreeHelper.GetChild(grid, 1); 
    textWidth = bd.ActualWidth; 

B) Si vous ne souhaitez pas utiliser l'arbre visuel

TreeViewItem selected = (TreeViewItem)dataSourceTreeView.SelectedItem; 
    double textWidth = 0; 
    Typeface typeface = new Typeface(selected.FontFamily, 
     selected.FontStyle, selected.FontWeight, selected.FontStretch); 

    GlyphTypeface glyphTypeface; 
    if (!typeface.TryGetGlyphTypeface(out glyphTypeface)) 
      throw new InvalidOperationException("No glyphtypeface found"); 

    string headerText = (string)selected.Header; 
    double size = selected.FontSize; 

    ushort[] glyphIndexes = new ushort[headerText.Length]; 
    double[] advanceWidths = new double[headerText.Length]; 

    for (int n = 0; n < headerText.Length; n++) 
    { 
      ushort glyphIndex = glyphTypeface.CharacterToGlyphMap[headerText[n]]; 
      glyphIndexes[n] = glyphIndex; 

      double width = glyphTypeface.AdvanceWidths[glyphIndex] * size; 
      advanceWidths[n] = width; 

      textWidth += width; 
    } 
1

Vous n'étiez pas très précis sur le texte ou les balises, donc je suppose que vous prenez à propos de TreeViewItem du .Net Framework.

Il peut y avoir des manières plus simples, mais une possibilité est d'utiliser la méthode Graphics.MeasureString. Il vous donne la taille en pixels d'un texte lorsqu'il est dessiné en utilisant une police spécifique.

+0

Oui, je veux dire t .Net. J'aurais dû être plus précis. J'écris le client dans WPF et Silverlight. FIXÉ. – MrPhil

+0

L'espace de noms System.Drawing n'est pas disponible dans Silverlight et d'après ce que je peux dire il n'y a pas de méthode équivalente autour de – MrPhil

1

@mrphil: Doux fœtus avorté, c'est effrayant

myTreeViewItem.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); 
Size s = myTreeViewItem.DesiredSize; 
return s.Width; 
+0

Merci d'avoir essayé, mais votre réponse ne fonctionne pas pour moi parce que: 1. vous avez une faute de frappe. DesireSize est une propriété et non une méthode donc 86 the(). 2. Vous constaterez que cela vous donne réellement la largeur de l'arbre entier pas cet élément particulier. 3. La taille qu'il rapporte semble impliquer une sorte de rembourrage et est toujours plus grande que la réponse de mon code rapporte. – MrPhil

+0

Ok - dans ce cas, utilisez Snoop (http://blois.us/Snoop/) pour trouver un objet approprié à mesurer –

+0

Cool tool! Merci! – MrPhil

Questions connexes