2010-10-16 12 views
1

désolé pour mon mauvais anglais ... La valeur par défaut pour un contenu RichTextBox est d'hériter la couleur de premier plan de la RichTextBox lui-même. C'est bien, mais si j'applique une couleur spécifique à une partie de mon texte, cette partie n'hérite plus du Foreground, évidemment. Comment puis-je rendre mon texte "coloré" à nouveau hérité du Foreground? Je suis en train de faire quelque chose comme la couleur « automatique » de Microsoft Office Word, mais après avoir mis une couleur spécifique à un TextRange, je ne sais pas comment il UNSET:/WPF RichTextbox remove Informations de premier plan de TextRange

TextRange.ClearAllProperties() fait ce que j'ai besoin, mais aussi permet d'effacer les autres propriétés de FontSize et FontFamily ...

TextRange.ApplyPropertyValue(ForegroundProperty, DependencyProperty.UnsetValue) aussi ne pas faire l'affaire ...

Répondre

1

Cela semblait presque impossible à réaliser car il n'y a pas de méthode « RemovePropertyValue ». J'ai aussi essayé avec span et obtenu la même exception que vous avez fait donc j'ai fait une méthode qui recueille tous les Paragraphs dans le TextRange et fait un span pour chaque séparément .. moins qu'idéale, je sais .. De toute façon, cela fonctionne pour un petit exemple, mais pourrait être assez difficile à travailler pour quelque chose de plus complexe.

private List<Span> m_spanList = new List<Span>(); 

private void c_setForegroundButton_Click(object sender, RoutedEventArgs e) 
{ 
    TextPointer textPointerStart = c_richTextBox1.Selection.Start; 
    TextPointer textPointerEnd = c_richTextBox1.Selection.End; 
    TextRange textRange = new TextRange(textPointerStart, textPointerEnd); 
    SetForeground(textRange); 
} 

private void c_clearForegroundButton_Click(object sender, RoutedEventArgs e) 
{ 
    foreach (Span span in m_spanList) 
    { 
     span.ClearValue(Span.ForegroundProperty); 
    } 
} 

public void SetForeground(TextRange textRange) 
{ 
    List<Paragraph> spannedParagraphs = new List<Paragraph>(); 
    if (textRange.Start.Paragraph != null) 
    { 
     TextRange curRange = null; 
     Block cur = textRange.Start.Paragraph; 
     do 
     { 
      spannedParagraphs.Add(cur as Paragraph); 
      // Get next range 
      curRange = new TextRange(cur.ContentStart, cur.ContentEnd); 
     } while ((textRange.End.Paragraph == null || !curRange.Contains(textRange.End.Paragraph.ContentEnd)) && (cur = cur.NextBlock) != null); 
    } 

    if (spannedParagraphs.Count == 1) 
    { 
     Span span = new Span(c_richTextBox1.Selection.Start, c_richTextBox1.Selection.End); 
     span.Foreground = Brushes.Red; 
     m_spanList.Add(span); 
    } 
    else 
    { 
     for (int i = 0; i < spannedParagraphs.Count; i++) 
     { 
      if (i == spannedParagraphs.Count - 1) 
      { 
       Paragraph paragraph = spannedParagraphs[i]; 
       // For some reason I get an exception here when I try this.. 
       //m_span = new Span(paragraph.ElementStart, c_richTextBox1.Selection.End); 
       c_richTextBox1.Selection.Select(paragraph.ElementStart, c_richTextBox1.Selection.End); 
       Span span = new Span(c_richTextBox1.Selection.Start, c_richTextBox1.Selection.End); 
       span.Foreground = Brushes.Red; 
       m_spanList.Add(span); 
      } 
      else if (i == 0) 
      { 
       Paragraph paragraph = spannedParagraphs[i]; 
       Span span = new Span(c_richTextBox1.Selection.Start, paragraph.ElementEnd); 
       span.Foreground = Brushes.Red; 
       m_spanList.Add(span); 
      } 
      else 
      { 
       Paragraph paragraph = spannedParagraphs[i]; 
       Span span = new Span(paragraph.ElementStart, paragraph.ElementEnd); 
       span.Foreground = Brushes.Red; 
       m_spanList.Add(span); 
      } 
     } 
    } 
} 
+0

Merci pour la réponse, le résultat de votre code est exactement ce dont j'ai besoin, mais ce n'était pas exactement ce que je cherchais. Dans mon cas, l'utilisateur crée le texte (sur un RichTextbox), donc il peut sélectionner plus qu'un simple paragraphe (ou seulement une partie). J'ai déjà essayé de créer un Span à partir du textRange sélectionné et "ClearValue (ForegroundProperty)" tous les inlines de cette étendue mais si l'utilisateur sélectionne plus d'un pargraph j'obtiens l'erreur: "start" et "end" TextPointers ne sont pas dedans le même paragraphe. " :( – Leo

+0

Meleak, merci ... votre code a fait l'affaire.Je vais jeter un oeil sur les documents les plus complexes, mais pour l'instant je pense que cela fonctionnera bien – Leo

+0

Je sais que c'est une vieille question, mais je pense que la réponse vous sont vraiment à la recherche de la réponse par @jmlumpkin ci-dessous. –

4

Vous pouvez également unset en définissant la propriété null (cela a fonctionné pour moi déblayer l'arrière-plan, par exemple la suppression mettant en évidence)

TextRange.ApplyPropertyValue (TextElement.BackgroundProperty, null);