Как определить, что элемент управления перемещается?

#wpf #position #drag #detect

#wpf #положение #перетаскивание #обнаружение

Вопрос:

Предположим, у меня есть окно с пользовательским UserControl, и в UserControl есть текстовое поле внутри. Когда я перетаскиваю окно, как текстовое поле может определить, что оно перемещается?

Я попытался выполнить поиск по его свойству RenderTransform, есть событие изменения, которое запускается при «изменении замораживаемого объекта или одного из его объектов». Ничего окончательного..

Редактировать :

В моем случае я не вижу окна, все, что я вижу, это UserControl, и я не могу подняться выше.

Ответ №1:

Вам нужно будет подписаться на события окна, поскольку ваше текстовое поле фактически не перемещается (скорее всего, оно находится в той же позиции, что и окно), поэтому вы можете подписаться на Window.LocationChanged событие, чтобы получать уведомления при перемещении окна.

Но также, если ваш элемент управления не имеет абсолютной позиции, вам нужно будет выполнить синтаксический анализ Window.SizeChanged , который сообщит вам, когда пользователь изменил размер окна, но это дискретное конечное событие, в отличие от текущего события.

Комментарии:

1. Спасибо. Но в моем случае это не работает, потому что на самом деле текстовое поле находится внутри пользовательского элемента управления, который находится внутри липкого окна mdi. В моем коде я не вижу mdi, поэтому я ничего не могу сделать на его основе. Я сказал, что у меня есть окно, просто чтобы упростить дело. Что мне нужно сделать, так это подойти к этому случаю по-другому. Это не должен быть фрейм, который запускает событие и сообщает всем, что они были перемещены. Текстовое поле должно само определять, что его местоположение изменилось.

2. Это также не будет работать для приложений, которые используют элементы управления перетаскиванием… в чем проблема, с которой я столкнулся.

Ответ №2:

Попробуйте подписаться на событие LayoutUpdated пользовательского элемента управления.

Комментарии:

1. Это хороший совет. При использовании LayoutUpdated обязательно проверьте, перемещался ли элемент управления, прежде чем выполнять дорогостоящую работу. Событие LayoutUpdated срабатывает не только при изменении положения. Если вы анимируете что-либо над элементом управления, событие LayoutUpdated имеет тенденцию часто срабатывать.

2. Это очень хорошее решение, когда ваш элемент управления находится на windowsformhost, а окно недоступно (насколько мне известно)