2011-04-20 2 views
1

Hey; У меня есть следующий визуальный hyerarchy в UserControl:Не умеет обрабатывать PreviewMouseDown

Grid -> Canvas -> MyContentControl

MyContentControl является класс, производный от ContentControl, который имеет Adorner на вершине, которая является прямоугольник, это сделать проще нажмите на определенные объекты (увеличьте область тестирования при тестировании). Адонист присутствует всегда, но с прозрачным фоном.

Я бы хотел увидеть события PreviewMouseDown, которые были подняты, когда я нажимаю на MyContentControl из кода пользователя usercontrol, но это событие, похоже, не поднимается там, только на уровне adorner.

Событие обрабатывается на уровне adorner, но e.IsHandled не установлен в true, поэтому он должен продолжать барботирование или туннелирование. Из того, что я читал, PreviewMouseDown является туннелированием, и IIRC, он должен был быть поднят в usercontrol в первую очередь.

Я что-то упустил?

спасибо.

ответ

3

Учитывая структуру, что вы описали реальное визуальное дерево будет выглядеть примерно так:

Window 
-> Grid 
    -> Canvas 
     -> MyContentControl 
-> AdornerLayer 
    -> MyContentControlAdorner 

Как вы видите, ваш Adorner (MyContentControlAdorner) находится в другой ветке дерева, чем пользовательский элемент управления. Это происходит потому, что украшения помещаются внутри специального элемента с именем AdornerLayer. Такой AdornerLayer обычно расположен непосредственно внутри элемента верхнего уровня (например, Window или Page).

Итак, учитывая все это, должно быть ясно, что если событие возбуждено в adorner, оно будет туннелироваться по следующему пути: Window -> AronerLayer -> MyContentControlAdorner.

При этом вы не можете обрабатывать событие мыши на двух элементах, расположенных в разных поддеревьях (хотя они размещены один поверх другого).

+0

Спасибо, теперь все очень ясно. –

Смежные вопросы