WPF RichTextBox.Selection
От: dsalodki Беларусь http://dsalodki.wix.com/resume
Дата: 12.01.23 08:31
Оценка:
нужно получить конец выделения начиная с позиции которой заканчивается некоторое слово в выделенном тексте (1е совпадение) и заканчивая текущей позицией выделенного слова
код ниже как сейчас, но не правильный

            origWord = origWord.Trim();
            targetWord = targetWord.Trim();

            TextRange textRange = Text.RichTextBox.Selection;
            var index = textRange.Text.IndexOf(origWord);

            string xaml;
            using (var memoryStream = new MemoryStream())
            {
                textRange.Save(memoryStream, DataFormats.Xaml);
                xaml = ASCIIEncoding.UTF8.GetString(memoryStream.ToArray());
            }

            var regex = new Regex($"\\b{origWord}\\b");
            var newText = regex.Replace(xaml, targetWord, 1);

            using (MemoryStream stream = new MemoryStream(ASCIIEncoding.UTF8.GetBytes(newText)))
            {
                Text.RichTextBox.Selection.Load(stream, DataFormats.Xaml);
            }

            var start = Text.RichTextBox.Selection.Start.GetPositionAtOffset(index + targetWord.Length);
            var end = Text.RichTextBox.Selection.End;
            Text.RichTextBox.Selection.Select(start, end);
Отредактировано 12.01.2023 8:55 dsalodki . Предыдущая версия .
Re: WPF RichTextBox.Selection
От: dsalodki Беларусь http://dsalodki.wix.com/resume
Дата: 12.01.23 09:16
Оценка:
разобрался, раньше работало просто, сейчас поменялся обработчик Text_Changed

        private void RichTextControl_TextChanged(object sender, TextChangedEventArgs e)
        {
            var rtb = sender as BindableRichTextBox;

            if (!rtb.IgnoreTextChanged.HasValue || !rtb.IgnoreTextChanged.Value)
            {

                var pos = rtb.CaretPosition;
                using (MemoryStream ms = new MemoryStream())
                {
                    TextRange range = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
                    range.Save(ms, DataFormats.Rtf);

                    ms.Position = 0;

                    rtb.IgnoreLoad = true;
                    DataSource = Encoding.UTF8.GetString(ms.ToArray());
                    rtb.IgnoreLoad = false;
                }
                rtb.CaretPosition = pos;
            }


            dataChanged = true;
        }

короче IgnoreTextChanged = true надо было задавать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.