Автоматическое выделение части текста в TextBox или RichTextBox - PullRequest
0 голосов
/ 01 ноября 2019

Можно ли выделить часть текста без выделения этой части текста, предпочтительно другим цветом в Textbox или Rich TextBox? Фактически, я имею в виду, что часть текста выделена другим цветом, отличным от цвета, назначенного для выделения текста. Чтобы уточнить, я приложил изображение, показывающее это поведение. (Изображение с веб-сайта, а не WPF). Жирная и темно-зеленая часть - это текст, который только что выделен, а серая область - выделенная часть. enter image description here

Ответы [ 2 ]

3 голосов
/ 01 ноября 2019

Использование элемента RichTextBox позволяет использовать дополнительные параметры стиля, которые, насколько мне известно, недоступны для обычного элемента TextBox.

Вот подход, который я создал:

// Generate example content
FlowDocument doc = new FlowDocument();

Run runStart = new Run("This is an example of ");
Run runHighlight = new Run("text highlighting in WPF");
Run runEnd = new Run(" using the RichTextBox element.");

// Apply highlight style
runHighlight.FontWeight = FontWeights.Bold;
runHighlight.Background = Brushes.LightGreen;

// Create paragraph
Paragraph paragraph = new Paragraph();
paragraph.Inlines.Add(runStart);
paragraph.Inlines.Add(runHighlight);
paragraph.Inlines.Add(runEnd);

// Add the paragraph to the FlowDocument
doc.Blocks.Add(paragraph);

// Apply to RichTextBox
YourRichTextBoxHere.Document = doc;

Просмотр снимка экрана

1 голос
/ 01 ноября 2019

Мне показалась эта статья полезной.

Подсветка искомого текста в WPF ListView

Хотя статья посвящена выделению искомого текста в ListView, я легкоадаптировал его в своем собственном коде для работы практически с любым элементом управления.

Начиная с элемента управления, который вы передаете, он будет рекурсивно искать TextBlock s и найдет нужный текст, извлечет его как встроенныйи изменит его Background / Foreground свойства.

Вы можете легко адаптировать код к поведению, если хотите.

Вот пример:

private void HighlightText(object controlToHighlight, string textToHighlight)
{
    if (controlToHighlight == null) return;

    if (controlToHighlight is TextBlock tb)
    {
        var regex = new Regex("(" + textToHighlight + ")", RegexOptions.IgnoreCase);

        if (textToHighlight.Length == 0)
        {
            var str = tb.Text;
            tb.Inlines.Clear();
            tb.Inlines.Add(str);
            return;
        }

        var substrings = regex.Split(tb.Text);
        tb.Inlines.Clear();

        foreach (var item in substrings)
        {
            if (regex.Match(item).Success)
            {
                var run = new Run(item)
                {
                    Background = (SolidColorBrush) new BrushConverter().ConvertFrom("#FFFFF45E")
                };

                tb.Inlines.Add(run);                            
            }
            else
            {
                tb.Inlines.Add(item);
            }
        }
    }
    else
    {
        if (!(controlToHighlight is DependencyObject dependencyObject)) return;

        for (var i = 0; i < VisualTreeHelper.GetChildrenCount(dependencyObject); i++)
        {
            HighlightText(VisualTreeHelper.GetChild(dependencyObject, i), textToHighlight);
        }
    }
}

Надеюсь, это полезно!

...