Pewnie wielu z Was spotkało się kiedyś z kontrolką RichTextBox, w której najprościej jest wyświetlić jakiś sformatowany dokument jak na przykład rtf.

Jakiś czas temu dostałem zadanie, które polegało na tym, że użytkownik wpisywał teść w polu z ograniczonym rozmiarem znaków. Jeżeli ilość znaków zostałaby przekroczona, tekst, który jest nadmiarowy miał zmienić kolor na inny niż czarny.

Sprawa nie była zbyt prosta jak się okazało ponieważ sam RichTextBox jest już problemem. Kontrolka nie posiada bezpośredniego bindingu do wpisanego tekstu. Spowodowane jest to przez to, że istnieje wiele rodzajów obiektów, które mogą być dziećmi tego komponentu wiec potrzebny jest workaround:

Napisałem extension method, które podaje mi wpisany tekst w polu.

Kolejną rzeczą, która jest potrzebna to informacja o tekście, któremu mam zmienić kolor. Do tego napisałem metodę, która zwraca mi obiekt typu TextPointer, który jest czymś w rodzaju wskaźnika.

Dzięki temu mogę w tym momencie sprawdzić jak długi jest wpisywany tekst i jeżeli tekst będzie większy od jego maksymalnego rozmiaru mogę pobrać informację od którego, do którego miejsca mam zmienić kolor.

3 linikji powyżej umożliwiają mi właśnie taki scenariusz.
W zmiennej range przechowywana jest wartość całego wpisanego teksu, start i end to nic innego jak zmienne, które mówią o tym od którego do którego miejsca mam zmienić kolor tekstu

Aby te 3 linijki grały ze sobą stworzyłem Behavior dla RichTextBox gdzie zapiąłem się na event TextChanged gdzie sprawdzam moje warunki i gdy trzeba zaczynam kolorować tekst na inny kolor

W całym moim obliczaniu są 2 najważniejsze rzeczy:

  1. Entery – trzeba pamiętać, że enter nie jest brany pod uwagę jeżeli tekst kolorujemy ale jest brany pod uwagę jeżeli liczymy znaki.
    Nie pytajcie dlaczego tak jest bo odpowiedź jest jedna… tak ma być!
  2. Wprowadzenie pierwszego znaku do RichTextBox powoduje, że automatycznie dodaje się na końcu enter i nie mam pojęcia jak to wyłączyć
Analizując kod można czepić się jednej rzeczy – co to jest wartość 98 od której odejmowana jest ilość enterów w tekście!
Moim założeniem jest wprowadzenie 100 znaków, 101 ma być koloru czerwonego, 98 jest dlatego ponieważ od 100 muszę odjąć jeszcze ten nieszczęsny enter, który jest dodawany automatycznie.
I magia się dzieje 🙂
Rozwiązanie, które Wam przestawiam jest chyba jednym ponieważ nigdzie, ale to nigdzie nie znalazłem choć czegoś podobnego do tego co zrobiłem.
Jedyne rozwiązania, na które można było natknąć się w Internecie to kolorowanie całości dokumentu albo poszczególnych paragrafów albo tylko zaznaczonego tekstu.
Więc jeżeli spotkacie u siebie tak problem to proszę bardzo, całość kodu na github