Eto: [WPF] A seleção de RichTextArea não está funcionando corretamente

Criado em 4 out. 2018  ·  7Comentários  ·  Fonte: picoe/Eto

Comportamento esperado

Texto selecionado corretamente de acordo com o intervalo definido.

Comportamento Real

Há um deslocamento de 5 caracteres à direita.

Etapas para reproduzir o problema

  1. Crie um controle RichTextArea
  2. Insira algum texto
  3. Defina uma seleção para definir sua cor

Código que demonstra o problema

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);

Especificações

  • Versão: 2.5.0-ci-10013
  • Plataforma (s): WPF
  • Sistema (s) operacional (is): Windows 10

WPF:

wpf

GTK2 (Linux):

gtk2_linux

Xamarin.Mac:

xamarin mac

Comentários muito úteis

@DanWBR , ah sim, isso não funcionará da maneira que você fez, infelizmente - WPF adiciona uma nova linha no final da propriedade Text (independentemente se o seu texto tem ou não). Não encontrei uma maneira de contornar isso neste momento, mas é uma questão separada desta.

O que eu recomendo é manter a posição atual em uma variável e incrementá-la após acrescentar o texto. Acessar a propriedade Text cada vez apenas para obter o comprimento diminuirá à medida que o texto fica maior.

Todos 7 comentários

No Windows, os caracteres de final de linha de alguma forma não são contados para os índices de seleções. Atualmente, uso o seguinte código como solução alternativa:

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);
        }

Mas isso é definitivamente um bug ...

Sim, eu usei o mesmo hack do @ManuelHu antes, não é bonito. Ainda não tenho certeza de como lidar com isso de forma eficaz sem ser lento demais com textos grandes.

Obrigado por relatar o problema!

Olá @DanWBR ,

Isso deve ser corrigido no último ramo de desenvolvimento. Você poderia tentar? Em todas as plataformas, as novas linhas agora são tratadas como um único caractere \n .

Olá @cwensley , ainda falta um caractere para consertar:

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

Ei @DanWBR , você tem uma reprodução para o off por um problema? Não consigo reproduzi-lo.

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

Talvez eu esteja usando índices errados? Ele funciona no macOS e GTK, no entanto.

@DanWBR , ah sim, isso não funcionará da maneira que você fez, infelizmente - WPF adiciona uma nova linha no final da propriedade Text (independentemente se o seu texto tem ou não). Não encontrei uma maneira de contornar isso neste momento, mas é uma questão separada desta.

O que eu recomendo é manter a posição atual em uma variável e incrementá-la após acrescentar o texto. Acessar a propriedade Text cada vez apenas para obter o comprimento diminuirá à medida que o texto fica maior.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Jojatekok picture Jojatekok  ·  33Comentários

jzlhll picture jzlhll  ·  14Comentários

rothomp3 picture rothomp3  ·  15Comentários

TomQv picture TomQv  ·  6Comentários

LaraSQP picture LaraSQP  ·  7Comentários