Eto: [WPF] Выбор RichTextArea работает некорректно

Созданный на 4 окт. 2018  ·  7Комментарии  ·  Источник: picoe/Eto

Ожидаемое поведение

Текст правильно выбран в соответствии с заданным диапазоном.

Фактическое поведение

Неправильное размещение 5 знаков справа.

Шаги по воспроизведению проблемы

  1. Создайте элемент управления RichTextArea
  2. Введите текст
  3. Определите выделение, чтобы установить его цвет

Код, демонстрирующий проблему

rtfcontrol.Appen(initialtext, true);
rtfcontrol.Append(sometext, true);
rtfcontrol.Selection = new Range<int>(rtfcontrol.Text.Length - sometext.Length, rtfcontrol.Text.Length -1);
rtfcontrol.SelectionForeground = Colors.Blue;
rtfcontrol.Append("\n", true);
rtfcontrol.Selection = new Range<int>(rtfcontrol.Text.Length);

Характеристики

  • Версия: 2.5.0-ci-10013
  • Платформы: WPF
  • Операционная система (ы): Windows 10

WPF:

wpf

GTK2 (Linux):

gtk2_linux

Xamarin.Mac:

xamarin mac

Самый полезный комментарий

@DanWBR , да, к сожалению, это не будет работать так, как у вас - WPF добавляет новую строку в конце свойства Text (независимо от того, есть он в вашем тексте или нет). На данный момент я не нашел способа обойти это, но это отдельная проблема.

Я бы рекомендовал сохранить текущую позицию в переменной и увеличивать ее после добавления текста. Доступ к свойству Text каждый раз только для получения длины будет замедляться по мере увеличения текста.

Все 7 Комментарий

В Windows символы окончания строки почему-то не учитываются в индексах выбора. В настоящее время я использую следующий код в качестве обходного пути:

private void Write(string message, Color c)
        {
            Append(message + Environment.NewLine, true);

            int idx = -1, last = -1;
            if (Environment.OSVersion.Platform == PlatformID.Unix)
            {
                idx = Text.LastIndexOf(message);
                last = Text.Length;
            }
            else
            {
                var lines = string.Join("", Text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries));
                idx = lines.LastIndexOf(message);
                last = lines.Length;
            }

            if (idx == -1)
                return;

            Selection = new Range<int>(idx, idx + message.Length);
            SelectionForeground = c;
            Selection = new Range<int>(last, last);
        }

Но это определенно ошибка ...

Да, раньше я использовал тот же хак, что и @ManuelHu , это

Благодарим за сообщение о проблеме!

Привет @DanWBR ,

Это должно быть исправлено в последней ветке разработки. Не могли бы вы попробовать? На всех платформах новые строки теперь обрабатываются как один символ \n .

Привет, @cwensley , осталось исправить еще один символ:

captura de tela 2018-11-16 as 08 06 39

Привет @DanWBR , у тебя есть репродукция по одному выпуску? Кажется, я не могу воспроизвести это.

https://github.com/DanWBR/dwsim5/blob/windows/DWSIM.UI.Desktop.Forms/Forms/Flowsheet/Flowsheet.eto.cs#L1245

Может я использую неправильные индексы? Тем не менее, он работает в macOS и GTK.

@DanWBR , да, к сожалению, это не будет работать так, как у вас - WPF добавляет новую строку в конце свойства Text (независимо от того, есть он в вашем тексте или нет). На данный момент я не нашел способа обойти это, но это отдельная проблема.

Я бы рекомендовал сохранить текущую позицию в переменной и увеличивать ее после добавления текста. Доступ к свойству Text каждый раз только для получения длины будет замедляться по мере увеличения текста.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги