private void caret_set_position(long char_index) { if (char_index < 0) { //попытка перевести каретку ДО начала текста - ставим каретку на начало char_index = 0; } if ((text_provider != null) && (char_index > text_provider.GetCharsCount())) { //попытка перевести каретку за границу текста (+1 символ) - пресекаем return; } //вычисляем координаты var outside = false; var caret_pt = text_area.GetCaretPosition((int)(char_index - screen_first_char), out outside); if (outside) //выходим за пределы отображаемой области - по идее такого быть не должно { char_index = screen_first_char; caret_pt = text_area.Bounds.Location; } if (Focused) { //на самом деле показываем каретку только когда захвачен фокус ввода Caret.SetCaretPos(caret_pt); } char_index_at_caret = char_index; //для обновление статусной области CharAtCaret = text_area.GetChar((int)(char_index_at_caret - screen_first_char)); OnViewChanged(new EventArgs()); }
private void caret_set_position(Point pt) { var char_index_screen = 0; var caret_pt = text_area.GetNearestCaretPosition(pt, out char_index_screen); if (Focused) { Caret.SetCaretPos(caret_pt); } char_index_at_caret = char_index_screen + screen_first_char; CharAtCaret = text_area.GetChar((int)(char_index_at_caret - screen_first_char)); OnViewChanged(new EventArgs()); }