2012-03-27 3 views
2

Я работаю над приложением WPF MVVM. Он имеет собственный класс canvas, наследующий Canvas. Существует окно с одним из этих пользовательских холстов, размещенных (используя XAML), и это цвет фона, установленный в Transaparent. Графика рисуется на холсте с помощью DrawingVisuals, чтобы нарисовать примитивные фигуры и добавить их как дочерние элементы Visual для дерева Visual. Это работает и отображает мои фигуры на экране.DrawingVisual Mouse Up Event

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

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

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

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

Благодаря

ответ

1

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

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

0

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

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

+0

Изменение моего пользовательского класса для наследования из FrameworkElement вместо этого, похоже, прекращает запуск событий. –

+0

Даже для MouseLeftButtonUp? – GazTheDestroyer

+0

Да, просто попробовал, и никаких событий не было. Это похоже на то, что у вас есть холст с указанным цветом фона. Но элемент Framework не имеет фонового цвета, поэтому мне нужно удалить XAML, который устанавливает этот атрибут. Тем не менее, цветные материалы могут быть не связаны. –

0

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

+1

Не думаю, что это применимо к DrawingVisuals, так как они не наследуются от UIElement или ContentElement, поэтому не могут обрабатывать маршрутизируемые события. Или так я и думал. –

0

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

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

Там есть подробное описание здесь: http://msdn.microsoft.com/en-us/library/ms747183.aspx

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

+0

Спасибо. Я попробовал PreviewmouseUp, но он срабатывает при тех же обстоятельствах, что и MouseUp. –

+0

Я попытался добавить обработчик для обработанных событий, и он запускается только при тех же обстоятельствах, что и обычное событие, которое, как я полагаю, предполагает, что это не означает, что событие обрабатывается. –

+0

@AlanMacdonald Хм, хорошо, сумасшедший. Хорошо, вот обходной путь для вас. создайте еще один холст прямо поверх вершины с той же шириной/высотой и установите фон в Прозрачный. Затем подпишитесь на это событие мыши. Да, я знаю, ужасно, но он должен работать. Если это не говорит вам, что DrawingVisual вообще не крадет события мыши, а что-то еще в вашем приложении ... –