Могу ли я установить IsHitTestVisible в false только для событий правой кнопки? - PullRequest
3 голосов
/ 18 января 2010

Очевидно, что прямой ответ на вопрос - «Нет», но как мне лучше всего добиться такого эффекта? Чтобы объяснить, вот немного предыстории ...

У меня есть приложение, которое отображает изображение плюс несколько слоев наложенных фигур на этом изображении. Все они размещены в ячейке таблицы, перекрывая друг друга, и изображение находится внизу локального z-порядка. Для ускорения наложения реализованы как классы, производные от FrameworkElement, и они создают и управляют своими собственными визуальными элементами.

Вот базовая диаграмма (хотя и взорванная в 3D) того, как слои расположены и какое взаимодействие они имеют / нуждаются:


overlapped_controls.png http://www.afterbang.co.uk/mal/stackoverflow/overlapped_controls.png


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

Мне бы очень хотелось отлавливать события левой кнопки мыши в прозрачной области этого верхнего слоя и позволять другим событиям попадать в слои дальше по z-порядку.

Есть ли шаблон WPF-стиля, которому я должен следовать для такого рода вещей? Какая-нибудь лучшая практика или техника?

Я все еще довольно новичок в WPF, но хочу написать решение, соответствующее API. Спасибо.

1 Ответ

1 голос
/ 18 января 2010

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

На самом деле это шаблон, который я использую для отображения фигур поверх изображений, чтобы пользователь мог обвести часть изображения, чтобы выделить его. У меня есть PreviewMouseDown на изображении, и оно постоянно работает нормально, затем у меня есть обработчик LeftMouseDown для любых фигур, чтобы их можно было перемещать, удалять и т. Д.

...