WPF RichTextbox удалить информацию переднего плана из TextRange - PullRequest
1 голос
/ 16 октября 2010

извините за мой плохой английский ... По умолчанию для контента RichTextBox является наследование цвета переднего плана от самого RichTextBox. Это хорошо, но если я установлю определенный Foreground цвет для какой-то части моего текста, эта часть больше не наследует Foreground, очевидно. Как я могу заставить мой «цветной» текст снова наследовать Foreground? Я пытаюсь сделать что-то вроде «Автоматически» цвета из Office Word, но после того, как я установил определенный цвет на TextRange, я не знаю, как его сбросить: /

TextRange.ClearAllProperties() делает то, что мне нужно, но также стирает другие свойства, такие как FontSize и FontFamily ...

TextRange.ApplyPropertyValue(ForegroundProperty, DependencyProperty.UnsetValue) тоже не добивается цели ...

Ответы [ 2 ]

4 голосов
/ 17 ноября 2010

Вы также можете сбросить его, установив для свойства значение null (это помогло мне очистить фон, например, убрав выделение)

TextRange.ApplyPropertyValue (TextElement.BackgroundProperty, null);

1 голос
/ 18 октября 2010

Это казалось почти невозможным для достижения, так как нет метода "RemovePropertyValue".Я также попробовал с span и получил то же исключение, что и вы, поэтому я создал метод, который собирает все абзацы внутри TextRange и сделал span для каждого отдельно ... менее чем идеально, я знаю ... В любом случае, это работает для небольшогопример, но может быть довольно сложно работать для чего-то более сложного.

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);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...