|
Не всегда срабатывает MouseDown
|
|||
---|---|---|---|
#18+
Здравствуйте! Есть код. Это маленькая программа рисовалка. XAML Код: html 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.
C# Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2020, 15:01 |
|
Не всегда срабатывает MouseDown
|
|||
---|---|---|---|
#18+
для рисование геометрических примитивов, таких как линии, кривые и т.д. в WPF используют геометрию PathGeometry и другие виды геометрий (к примеру, StreamGeometry и т.д.). А для отображения геометрии на экране используют элементу управления Shape, это может быть как собственный Shape с рассчитываемой геометрией внутри, либо объект Path, который отображают любую геометрию, которую ему предоставят. То есть, изучите следующие темы: 1) Синтаксис разметки геометрии https://docs.microsoft.com/ru-ru/dotnet/framework/wpf/graphics-multimedia/path-markup-syntax, синтаксис 1 в 1 как в SVG 2) Разобраться в таких объектах как Freezable , Geometry , PathGeometry 3) Разобраться в таких элементах управления как Shape , Path как пример, можно глянуть вот это: https://github.com/meytes/LSystemShape ... |
|||
:
Нравится:
Не нравится:
|
|||
05.08.2020, 18:09 |
|
Не всегда срабатывает MouseDown
|
|||
---|---|---|---|
#18+
Roman Mejtes, ОК, спасибо за ссылки! Прочитаю эти материалы. Roman Mejtes для рисование геометрических примитивов, таких как линии, кривые и т.д. в WPF используют геометрию PathGeometry и другие виды геометрий (к примеру, StreamGeometry и т.д.). А для отображения геометрии на экране используют элементу управления Shape, это может быть как собственный Shape с рассчитываемой геометрией внутри, либо объект Path, который отображают любую геометрию, которую ему предоставят. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 09:39 |
|
Не всегда срабатывает MouseDown
|
|||
---|---|---|---|
#18+
ferzmikk Но все таки хотелось бы понять почему в данной ситуации не всегда срабатывает событие на нажатие кнопки мыши. Ведь в панеле инструментов присутствует объект Canvas и он же как то должен корректно работать. Или используется в только в других случаях. А есть уверенность, что не срабатывает именно обработчик события? Внутри него есть условные ветвления, может, в зависимости от неких условий не срабатывают они? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 10:09 |
|
Не всегда срабатывает MouseDown
|
|||
---|---|---|---|
#18+
Сон Веры Павловны А есть уверенность, что не срабатывает именно обработчик события? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 10:51 |
|
Не всегда срабатывает MouseDown
|
|||
---|---|---|---|
#18+
событие MouseDown может не сработать по нескольким причинам: А) событие уже было обработано другим элементом управления, который находится внутри вашего Canvas или находится поверх него. в WPF есть 2 типа таких событий: обычный событий и Preview события (для примера PreviewMouseDown и MouseDown), оба этих события маршрутизируемые. PreviewMouseDown - это туннелированное событие (tunnel), оно поднимается от корневого элемента управления (окна) к вершинам. Элементы управления принимая это событие проверяют (выполняют HitTest) на них или нет было осуществлено это нажатие и возбуждают ответное пузырьковое (всплывающее) событие, например, MouseDown. MouseDown - пузырьковое событие (bubble), оно опускается от вершины на которое вы нажали к корню. Почитайте об этом подробнее https://metanit.com/sharp/wpf/6.php. Б) Элемент управления на который вы нажимаете не имеет заднего фона. У элементов управления есть свойство Background, которое определяет цвет заливки элемента управления, тип свойства Brush, если это свойство задано как {x:Null} (значение по умолчанию), то такой элемент управления не имеет фона, то есть он образно говоря с дыркой, следовательно он не пройдет HitTest, то есть событие MouseDown не будет вызвано, элемент будет прозрачным для взаимодействия. Если задать цвет фона Transparent, элемент управления хоть и останется прозрачным (визуально), но начнет реагировать на событий В) у элемента управления задано свойство HitTestVisibility = false, такой элемент не будет событий ввода. Если короче, то можно либо: А) использовать Preview события, этот метод плохой, так как нарушает всю концепцию Б) задать фон элементу управления на котором осуществляется ввод с мышки В) обрабатывать события не напрямую с элемента управления, а в элементе управления предке или корневом элементе управления. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.08.2020, 11:22 |
|
Не всегда срабатывает MouseDown
|
|||
---|---|---|---|
#18+
Если упростить пример кода, чтобы акцентироваться на проблему, то получится так: XAML Код: html 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
C# Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125.
Roman Mejtes событие MouseDown может не сработать по нескольким причинам: Подскажите, как в Visual Studio отслеживать какие события запускаются/улавливаются? Roman Mejtes Если короче, то можно либо: А) использовать Preview события, этот метод плохой, так как нарушает всю концепцию Код: html 1. 2.
то также Б) задать фон элементу управления на котором осуществляется ввод с мышки [i]Background указан. В) обрабатывать события не напрямую с элемента управления, а в элементе управления предке или корневом элементе управления.Если так написать Код: html 1. 2. 3.
то опять также ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2020, 20:12 |
|
Не всегда срабатывает MouseDown
|
|||
---|---|---|---|
#18+
ferzmikk Подскажите, как в Visual Studio отслеживать какие события запускаются/улавливаются? Наверное, только проверить экспериментально. Это очень зависит от контейнеров компоновки. Вы знакомы с концепций событий в WPF? Все события возникают на уровне ОС. Допустим, юзер нажал кнопку. Драйвер клавиатуры определил это и послал сообщение OC. ОС определяет, что сейчас активно окно такого-то приложения. Какой именно элемент в окне сейчас вводи текст - ОС не знает. Она просто передаёт Окну, что нажата кнопка. Окно тоже имеет в себе множество UI элементов. Какой элемент требует ввода она не знает. Она просто вызывает вложенный элемент и передаёт ему событие. Тот элемент передаёт своему дочернему. И так событие спускается вниз пока не наткнётся на элемент который ожидает это событие. Такие спускающиеся события называются туннельными. И обычно имеют префикс Preview. Если элемент сам обрабатывает событие, то он может отменить его дальнейшее погружение. И его дочерние элементы это событие уже не получат. Обработав туннельное событие UI элемент создаёт событие, уведомляющее об этом. Это событие начинает наоборот движение снизу-вверх, для того чтобы вышестоящие контейнеры могли обработать изменение дочерних элементов. То есть в элемент пришло сверху событие, допустим, PreviewMouseDown и если он его обработал, то он посылает вверх событие MouseDouwn. Такие события называются пузырьковыми (буквальный перевод) или всплывающими (более распространено в русс. среде). Выше стояший контейнер может обработать такое событие и прекратить его всплытие. Допустим, таким образом поступают кнопки (ButtonBase) они обрабатывают событие MouseLeftButtonDown и дальше из них оно не всплывает. Поэтому, во многих случаях, чтобы контейнер знал о событии, надо обрабатывать туннельные события (Preview...), так как всплывающие события из вложенных элементов могут просто не дойти, не всплыть до контейнера. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2020, 09:17 |
|
Не всегда срабатывает MouseDown
|
|||
---|---|---|---|
#18+
Eld Hasp Вы знакомы с концепций событий в WPF? Поэтому, во многих случаях, чтобы контейнер знал о событии, надо обрабатывать туннельные события (Preview...),Скажите, а смысл использования туннельных событий, если MouseDown привязан к одному элементу - Canvas . Код: html 1. 2. 3.
Туннельные события используются в основном, когда так пишут. Код: html 1. 2. 3.
так как всплывающие события из вложенных элементов могут просто не дойти, не всплыть до контейнера.Все таки хотелось как нибудь отследить, что доходит и что не доходит до контейнера, и почему. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2020, 16:08 |
|
Не всегда срабатывает MouseDown
|
|||
---|---|---|---|
#18+
ferzmikk Скажите, а смысл использования туннельных событий, если MouseDown привязан к одному элементу - Canvas . Один из дочерних элементов Canvas может не дать всплывать MouseDown и до Canvas это событие не дойдёт. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2020, 19:32 |
|
Не всегда срабатывает MouseDown
|
|||
---|---|---|---|
#18+
ferzmikk, кстати почему у вас Canvas без размеров? Или я чего-то не вижу? По умолчанию у Canvas размер, вроде, ноль. Попробуйте явно задать привязку размеров к размерам внешнего контейнера. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2020, 19:37 |
|
Не всегда срабатывает MouseDown
|
|||
---|---|---|---|
#18+
Eld Hasp, размер элемента управления определяет не он сам, а его контейнер, элемент управления только "сообщает" контейнеру желаемый размер. Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2020, 07:19 |
|
Не всегда срабатывает MouseDown
|
|||
---|---|---|---|
#18+
в общем не поленился, глянул код автора, говнокод редкостный, просто адище, сильно его вычищать не стал, не моё это дело, но вот рабочее решение: Замечания по коду:
Код: c# 1. 2.
во первых, операция не "атомарна" (на уровне выполнения кода, а не процессора), то есть вы получаете позицию 2 раза, между 1 и 2 разом может произойти всё, что угодно во вторых, в методе e.GetPosition(null) нужно указывать тот объект, относительно которого вы хотите получить координаты, следовательно в аргументах должна быть ссылка на объект Canvas, а не на Null; правильнее будет e.GetPosition((IInputElement)sender) или e.GetPosition((Canvas)sender). Даже затрудняюсь сказать, что будет если передать Null, скорее всего будет использован или текущий элемент или окно. Но это не очевидно и неправильно. я бы мог еще долго тут разносить этот код, но время дорого стоит. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2020, 09:03 |
|
Не всегда срабатывает MouseDown
|
|||
---|---|---|---|
#18+
Roman Mejtes, вы правы. По какой-то причине (уже не могу вспомнить), я думал, что у Canvas иное поведение. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2020, 09:22 |
|
Не всегда срабатывает MouseDown
|
|||
---|---|---|---|
#18+
Eld Hasp, Canvas действительно сообщает контейнеру, что его желаемый размер является (0.0, 0.0), по этому, если вы размещаете Canvas в таком элементе управления, у которого ширина или высота бесконечны (StackPanel, ScrollViewer (с прокруткой) и т.д. То Canvas будет иметь 0 размер по соответствующим осям ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2020, 09:35 |
|
|
start [/forum/topic.php?fid=21&fpage=2&tid=1440266]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 159ms |
0 / 0 |