Могу ли я установить для IsHitTestVisible значение false только для событий правой кнопки?

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

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

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


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


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

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

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

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


person Mal Ross    schedule 18.01.2010    source источник


Ответы (1)


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

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

person Nathan Wheeler    schedule 18.01.2010
comment
Спасибо. Я загрузил изображение на новый сайт и соответствующим образом обновил его URL. Надеюсь, это исправлено. И спасибо за совет по PreviewMouseDown. Я обдумывал это, но не был уверен, что это правильный путь. - person Mal Ross; 18.01.2010
comment
Ну, если быть совсем честным, иногда метод по инструкции работает не во всех ситуациях. В моей ситуации я не помещаю свои фигуры в отдельные слои. Я не совсем уверен, каков официальный способ сделать это, но способ PreviewMouseDown выглядит действительно чистым в моем коде, так как мне нужно настроить все для других моих событий. - person Nathan Wheeler; 18.01.2010
comment
Мне было интересно, как вы структурировали свои материалы. Я попробовал подход PreviewXXX, прежде чем понял, что он никогда не сработает для меня, потому что мое изображение не является родителем слоев фигур в логическом (или визуальном) дереве. Я действительно хочу, чтобы логика слоев фигур была отделена от изображения, поэтому я подозреваю, что в конечном итоге я помещу обе вещи в какой-то родительский элемент управления и использую события PreviewXXX, чтобы предложить функциональность дочерним слоям. Посмотрим. :) Я снова напишу здесь, если придумаю что-нибудь хорошее. - person Mal Ross; 19.01.2010
comment
Да, вам придется иметь их всех с одним логическим родителем. У меня есть ‹Grid›‹Image›‹/Image›‹Grid›‹Shape(s)›‹/Shape(s)›‹/Grid›‹/Grid› с моим событием PreviewMouseDown, обрабатываемым в родительской сетке. - person Nathan Wheeler; 19.01.2010