Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TextBox MouseDown, Получить позицию курсора при MouseDown 
V
    Опции темы
Bladerender
Дата 26.1.2011, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



Такая задача. TextBox. Я нажимаю на текст внутри него левой кнопкой мыши и в состоянии "левая кнопка зажата и удерживается" я хочу узнать позицию в тексте, на которой я нажал и держу. 


Как я это пытаюсь сделать. Подписываюсь на ивент PreviewMouseLeftButtonDown. 

Код

private void textBox1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            //Узнаю длину текста, что и есть собственно положением в тексте.
            int textpos = new TextRange(textBox1.Document.ContentStart, textBox1.CaretPosition).Text.Length;
        }


В чем проблема такого подхода. В том, что каретка переходит на новое место после того как нажали и отжали мышку. А в состоянии нажато она еще не перешла на новую позицию, хотя палочка каретки уже перешла на новое место. Подскажите выход, а то как-то никак...



PS: И какая разница между MouseLeftButtonDown и PreviewMouseLeftButtonDown? А то без Preview у меня и этого сделать не получилось. Как-то он не срабатывает...

Это сообщение отредактировал(а) Bladerender - 26.1.2011, 18:12
PM MAIL   Вверх
Kefir
Дата 1.2.2011, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 22
Всего: 87



Оба эвента - RoutedEvents. Разница в том, что все эвенты, которые начинаются с приставки Preview - туннельные (Tunnel strategy). Остальные эвентаы как правило пузырьковые (Bubble strategy). Первые идут от корня дерева элементов к дочерним контролам, вторые - наоборот.

Если по-простому описать - preview происходит ДО того как происходит реакция на нажатие кнопки. А второй эвент - после. Поэтому если ты подписываешься на превью - твой текстбокс ещё не отреагировал на событие нажатия на кнопку (а значит и каретку не переместил ещё). Так что тут тебе ловить нечего smile В твоих целях эвент не подходит.

Подписываться надо именно на MouseLeftButtonDown. Только как ты правильно сказал для контрола ТекстБокс этот эвент не срабатывает. Это происходит потому, что некоторые контролы самолично обрабатывают некоторые эвенты и помечают их как обработанные. А если эвент помечен как обработанный то дальше он не выстреливает для подписчиков. Для того чтобы это обойти - подписывайся на эвент в коде следующим образом и будет тебе счастье:
Код

textBox1.AddHandler(UIElement.MouseLeftButtonDownEvent, (MouseButtonEventHandler)ТвойКлёвыйОбработчик, true);

true в третьем параметре даст понять фреймворку, что ты хочешь подписать в том числе и на обработанные эвенты.

Это сообщение отредактировал(а) Kefir - 1.2.2011, 21:54
PM MAIL WWW Skype   Вверх
Bladerender
Дата 2.2.2011, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



Спасибо. Сработало. Почитаю, почитаю... 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0408 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.