DrawingVisual Mouse Up Event - PullRequest
       16

DrawingVisual Mouse Up Event

2 голосов
/ 27 марта 2012

Я работаю над приложением WPF MVVM.У него есть собственный класс холста, наследуемый от Canvas.Есть окно с одним из этих пользовательских холстов (с использованием XAML), и его цвет фона установлен как прозрачный.Графика рисуется на Canvas с помощью DrawingVisuals для рисования примитивных фигур и добавления их в качестве визуальных дочерних элементов в визуальное дерево.Это работает и отображает мои фигуры на экране.

Я добавил событие мыши в Canvas в коде окна позади.Это срабатывает, когда я щелкаю в любом месте холста, кроме линии нарисованного изображения или цветной области заполненной фигуры.Для ясности:

  • Если я щелкаю за пределами нарисованной фигуры, т.е. на фоне холста, она срабатывает.
  • Если есть незаполненный прямоугольник, и я нажимаю на внутреннюю пустую областьтогда мышь поднимается.
  • Если я щелкаю на границе прямоугольника, это не так.
  • Если я щелкаю внутри прямоугольника с заливкой, это не так.

Начиная с http://msdn.microsoft.com/en-us/library/ms742254.aspx#providing_hit_testing_support кажется, что это должно работать, хотя я использую событие Canvas MouseUp, поскольку оно не имеет события MouseLeftButtonUp.В примере с MS они не используют Canvas, а говорят о «главном контейнере», но я не уверен, что это актуально.

Как я могу получить события, которые будут срабатывать при нажатии на DrawingVisual?Почему событие прерывается при нажатии внутри нарисованной области, но не за ее пределами?

Спасибо

Ответы [ 4 ]

1 голос
/ 27 марта 2012

Я решил проблему. Холст имеет свойство зависимостей RootNode, которое устанавливает ViewModel. Проблема в том, что когда вы добавляете дочерних элементов на холст, вам нужно вызвать AddVisualChild (child) и AddLogicalChild (child). Мне пришлось добавить обратный вызов измененного свойства в свойство зависимостей, чтобы он мог вызывать два метода для добавления их в качестве визуальных и логических дочерних элементов, в противном случае он не понимает родительские дочерние отношения, которые портят пользовательский ввод.

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

0 голосов
/ 27 марта 2012

Вы должны прочитать эту статью о перенаправленном событии http://msdn.microsoft.com/en-us/library/ms742806.aspx И как перенаправленное событие пересечет прямоугольник, чтобы добраться до основного холста:)

0 голосов
/ 27 марта 2012

Вы пытались подписаться на событие PreviewMouseUp, а также MouseLeftButtonUp на родительском Canvas?Вышеуказанное должно работать, но что-то в визуальном дереве, вероятно, помечает событие как Обработанное, поэтому оно не распространяется.

Обработка предварительного просмотра гарантирует, что вы сначала получите событие (поскольку предварительный просмотр туннеля вниз, затем события всплывают, но если обрабатывается какое-либо событие предварительного просмотра, дальнейшие события не передаются).

Подробный обзорздесь: http://msdn.microsoft.com/en-us/library/ms747183.aspx

Кроме того, если это не удается, вы всегда можете попробовать обработчик класса для события (в основном переопределение вышеупомянутого поведения): http://msdn.microsoft.com/en-us/library/ms747183.aspx#AddingInstanceHandlersthatAreRaisedEvenWhenEventsareMarkedHandled

0 голосов
/ 27 марта 2012

Я подозреваю, что это может быть из-за того, что Canvas выполняет тестирование для вас, и, таким образом, щелчки мыши перенаправляются на дочерние визуальные элементы.

Можете ли вы попробовать вместо этого FrameworkElement. Вам нужно какое-то поведение Canvas?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...