|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||
UWP DragPositionBehavior при быстром перемещении курсора теряется его позиция21.11.2021, 17:34. Показов 4708. Ответов 55
Метки нет (Все метки)
Я написал простой Behavior для того, чтобы перемещать элемент внутри Canvas.
Элемент перемещается, всё хорошо, пока я не захватываю элемент за край. В таком случае елемент легко может потерять текущее местоположение курсора, но OnElementPointerReleased не сработает, а следовательно и не сработает отписка от OnMove. Это значит, что когда курсор покидает элемент, при том, что до этого я на него нажал, элемент не видит куда я перемещаю курсор, не видит отжал ли я кнопку мыши. Если я верну курсор мыши обратно в элемент, он продолжит функционировать должным образом.
BaseElement нужен в тех случаях, когда у меня Parent может быть этот же элемент. Например когда там будет Grid в Grid'е.
0
|
|||||||||||
| 21.11.2021, 17:34 | |
|
Ответы с готовыми решениями:
55
При быстром перемещении окон и открытии меню приложение тормозит ubuntu Позиция курсора и его форма Выделение при перемещении курсора в StringGrid |
|
Модератор
|
|
| 13.12.2021, 12:12 | |
|
Такого типа как Behavior обрабатываемого WPF нет.
Behavior - это тоже AP свойство, но уже реализованное в библиотеке. Немного подробнее в этой теме: AP свойство-коллекция для биндинга всплывающих RoutedComman к командам VM
1
|
|
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 13.12.2021, 12:13 [ТС] | |
|
То есть таким образом я из статического метода могу вызвать не статический.
0
|
|
|
Модератор
|
||
| 13.12.2021, 12:47 | ||
|
Мне сегодня некогда. Повозитесь сами. Возможно завтра смогу посмотреть детальнее. Добавлено через 3 минуты Но вы его наследовали от DependecyObject?
0
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 13.12.2021, 13:19 [ТС] | |
|
0
|
|
|
Модератор
|
||
| 13.12.2021, 13:35 | ||
|
Для этого не обязательно использовать независимый элемент. Так как нужны относительные координаты по отношению к неподвижному (в окне) элементу, то можэно их определять по отношению к самому Окну. В WPF для этого используется GetPosition(null) - возможно в UWP. Но там была проблема (насколько помню) при выходе курсора за границу элемента (захват за край). И подписка на MouseUp нужна по отношению к более высокому контейнеру. Можно динамически подыматься то первой панели, или до Page? или доя Window. Можно под BaseParent сделать отдельное AP-свойство. То есть смысла оставлять в DragPosition это свойство нет. Свойство ZoomFactor - даже не представляю где оно может отличаться от 1. Но даже если нужно, теперь есть внешние привязки которые можно использовать с конвертером. Поэтому тоже смысла в этом свойстве нет. И в итоге у вас не останется в DragPosition DP-свойств. Будут только AP-свойства. А для них можно использовать обычный или даже статический класс.
1
|
||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||
| 13.12.2021, 17:19 [ТС] | |||||||
Добавлено через 43 минуты Элд Хасп, удалил Behavior. Сделал AP для BaseParent и ZoomFactor. Не делал обработку если BaseParent -- null, так как до этого момента у меня уже всё идёт не по плану. Основная проблема -- полное непонимание работы с статическими AP и не статическими, приватными методами/полями. Для того, чтобы у меня хотябы сбилдился проект, пришлось сделать поля статическими (что неправильно).
0
|
|||||||
|
Модератор
|
|||
| 13.12.2021, 19:29 | |||
|
Перемещение же элементов происходит в экранных координатах. Зум здесь не должен играть роль. Если у вас в Модели (SomeType) есть зум и нужно его учитывать при привязке к его свойствам Position, то это нужно делать в конвертере привязки. А то получается у вас первичная привязка без зума, а смещение с зумом. Мне, кажется, какая-то каша выйдет. В данном случае работает, потому что одновременно захват нескольких элементов не предусмотрен. А если придётся перемещать несколько, то сразу будет попандос. Вам нужно привязать какие-то значения к тому же объекту для которого создано AP-свойство. Два основных варианта: 1) дополнительное приватное AP-свойство? которое буде хранить контейнер с нужными данными. В данном случае - это просто Point начальной позиции, но можно сделать какой-то приватный класс со множеством свойств. Он и будет играть роль тела Behavior: 2) В случае когда можно определить момент отписки/подписки (как в данной задаче), можно использовать статический словарь где элемент ключ, а значение это контейнер с данными. Есть ещё третий вариант со словарём со слабыми ссылками - он используется когда момент удаления связи нельзя определить. В данном случае это избыточно.
1
|
|||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||
| 13.12.2021, 19:55 [ТС] | ||||||||||
Добавлено через 2 минуты
Добавлено через 2 минуты
Добавлено через 5 минут
0
|
||||||||||
| 13.12.2021, 19:59 [ТС] | |
|
Не по теме: Элд Хасп, очень онтересно.
0
|
|
|
Модератор
|
||
| 14.12.2021, 18:13 | ||
eldhasp чтобы не путаться с вашими изменениями.Иду по пути полной аналогии, а уже потом, при желании, можно будет вносить в него изменения. Для начала удаляю ZoomFactor - на мой взгляд от него только путаница как при реализации, так и при использовании. А из Parent - делаю AP-свойство. Проверяем работу - всё ок! Фиксация ab79449d.
0
|
||
| 14.12.2021, 18:29 [ТС] | |
|
0
|
|
|
Модератор
|
|||||||||||
| 14.12.2021, 18:42 | |||||||||||
|
limeniye, продолжаем.
Теперь можно безболезненно убрать наследование от DependencyObject. Дальше определяем какие элементы нужны для обработчиков события и выносим их в отдельный класс. В обработчиках у нас идёт обращение: к самому элементу, к родительской панели, точки относительно которой идёт перемещение. Вроде, всё. Сами обработчики тоже переносим в доп.класс:
Фиксация 67bc3249.
1
|
|||||||||||
|
Модератор
|
||||||||||||||||
| 14.12.2021, 19:30 | ||||||||||||||||
|
limeniye, продолжаем.
Теперь можно удалить все обработчики из Behavior. Остаются только методы Attach и Detach. В этих методах происходит отключение-подключение прослушки основного события и нужно сохранять экземпляр HandlersData. Сделаем под него приватное AP-свойство. И в его изменение будет делать действия из Attach и Detach. Для начала в HandlersData добавляем возможность уничтожения экземпляра:
Создание и сохранение HandlersData делаем в методе DragPositionChanged:
Фиксация f1160e67. Добавлено через 14 минут Теперь чистка кода, переименование. Фиксация bfe8fa41. Добавлено через 4 минуты На этом рефакторинг закончен. Но нужно ещё вынести в отдельный класс "обходной манёвр" что я сделал для возможности задания привязок в сеттерах. Нужно его сделать обобщенным, что бы можно было использовать с любым классом. Создавать его надо на основе стиля или на основе коллекции SetterBaseCollection. Но можно и свою каку-то придумать, которая будет принимать сеттеры. Сможете с этим справиться7
1
|
||||||||||||||||
| 14.12.2021, 19:30 | |
|
Помогаю со студенческими работами здесь
56
Вызвать событие при перемещении курсора Событие при при перемещении курсора мыши в уже выпавшем списке ComboBox Процессор нагружается при перемещении курсора мыши Word: запускать макрос при перемещении курсора
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы
Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
|
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция
Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
|
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
|
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
|
|
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
|
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика
Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
|
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации:
В классе Работник добавить:
накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни
коэффициентПрезентеизма — снижает продуктивность. . .
|
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день.
Для работы необходим браузер,. . .
|