2010-03-31 5 views
3

J'expérimente le RichTextBox WPF et remarque que je peux parcourir les blocs qui composent son document en bouclant via RichTextBox.Document.Blocks.WPF RichTextBox - Bloc sélectionné?

Quelle est la meilleure façon d'obtenir le Bloc qui entoure le curseur?

Je peux obtenir les propriétés CaretPosition et ElementStart et ElementEnd de chaque bloc, mais je ne vois pas comment les comparer parce que les décalages de caractères réels ne sont pas exposés à moins que je ne manque quelque chose d'évident.

Répondre

8
var curCaret = richTextBox1.CaretPosition; 
var curBlock = richTextBox1.Document.Blocks.Where(x => x.ContentStart.CompareTo(curCaret) == -1 && x.ContentEnd.CompareTo(curCaret) == 1).FirstOrDefault(); 
+0

Merci Matt. Exactement ce que je cherchais. –

1

La réponse ci-dessus fonctionne probablement dans WPF RTB mais pas dans Silverlight 4.0. Il est très probable que SL n'autorise pas l'accès au document Protion du RTB. Donc, vous devez le faire via la réflexion ....

Quelque chose comme ceci:

  • Mettre en place un gestionnaire d'événements TextSelectionChanged
  • Prenez le pointeur TextSelection et trouver le début TextPointer
  • Prenez le TextSelection .Start.Parent article
  • savoir si elle est de type paragraphe
  • Parse les Paragraph.Inlines
  • Recherchez le type de InlineUIContainer dont vous avez besoin.
+1

Merci. Je n'utilise plus WPF. Je me suis finalement rendu compte qu'il y avait trop de cerceaux comme celui-ci pour sauter à travers et donc je suis retourné à WinForms ... –

0

En Silverlight5 obtenir les propriétés à utiliser pour mettre à jour une barre d'outils:

private void rtb_SelectionChanged(object sender, RoutedEventArgs e) 
{ 
    TextSelection ts = rtb.Selection; 
    object property; 

    property = ts.GetPropertyValue(Run.FontWeightProperty); 
    System.Windows.FontWeight fontWeight = property is System.Windows.FontWeight ? (FontWeight)property : FontWeights.Normal; 

    property = ts.GetPropertyValue(Run.FontStyleProperty); 
    System.Windows.FontStyle fontStyle = property is System.Windows.FontStyle ? (FontStyle)property : FontStyles.Normal; 

    TextDecorationCollection textDecorations = ts.GetPropertyValue(Run.TextDecorationsProperty) as TextDecorationCollection; 
    bool isUnderlined = textDecorations != null; 

    double? fontSize = ts.GetPropertyValue(Run.FontSizeProperty) as double?; 
    SolidColorBrush foreground = ts.GetPropertyValue(Run.ForegroundProperty) as SolidColorBrush; 
    Color foregroundColor = foreground != null ? foreground.Color : Colors.Black; 

    System.Diagnostics.Debug.WriteLine("fontweight:{0}, fontStyle:{1}, Underline:{2}, size:{3}, color:{4}", 
     fontWeight, 
     fontStyle, 
     isUnderlined, 
     fontSize, 
     foregroundColor); 

    if (fontSize.HasValue) 
     SetToolbarFontSize(fontSize.Value); 

    SetToolbarFontColor(foregroundColor); 
} 
Questions connexes