2010-05-31 4 views
5

Я пытаюсь создать приятную зону перетаскивания в WPF, которая отображается в слое adorner, когда что-то перетаскивается в основное приложение. Проблема в том, что я не получаю никаких событий от моего поклонника, хотя он, согласно документации, должен получать все входные события, так как он находится в более высоком порядке z.Нет событий, переданных WPF adorner layer

Чтобы отладить мою проблему, я создал очень простой пример, когда у меня есть пользовательский элемент управления, в котором есть только кнопка. Этот пользовательский элемент управления отображается на уровне adorner, но я не могу нажать кнопку. Зачем? Что я сделал не так?

Мой класс Adorner строится так:

public ShellOverlayAdorner(UIElement element, AdornerLayer adornerLayer) 
     :base(element) 
    { 
     _adornerLayer = adornerLayer; 

     _overlayView = new AdornedElement(); 
     _overlayView.AllowDrop = true; 
     _adornerLayer.Add(this); 
    } 

и создается в главном окне,

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     adornerLayer = AdornerLayer.GetAdornerLayer(MyTopGridWithButtonInIt); 
     ShellOverlayAdorner shell = new ShellOverlayAdorner(MyTopGridWithButtonInIt, adornerLayer); 

    } 

Я не получаю никаких событий вообще от моего контроля, т.е. не щелчков мыши , мышь, щелчки на кнопках. Я даже не могу нажать кнопку в слое adorner. Что я сделал не так?

+1

Это работает хорошо для меня ... ты уверен, что вы не установили IsHitTestVisible ложь на вашем Adorner? –

+0

Хммм .. Странно, потому что я получаю это для всех тестовых проектов, которые я создаю. Нет, я не установил IsHitTestVisible в false. Я проверил настройку на true и false, чтобы получить изменения, но ничего не происходит. – Johanna

ответ

11

Я не знаю, если вы уже пробовали это: Если вы хотите, чтобы добавленный элемент реагировал на события, я думаю, что этот элемент должен быть привязан к визуальному дереву adorner. Способ сделать это состоит в использовании VisualCollection, intitialized к самому Adorner или, по крайней мере, таким образом, это, кажется, работает:

VisualCollection visualChildren; 
    FrameworkElement @object; 

    public CustomAdorner(UIElement adornedElement) : 
     base(adornedElement) 
    { 
     visualChildren = new VisualCollection(this); 
     @object = new Button {Content = "prova"}; 
     visualChildren.Add(@object); 
    } 
    protected override Visual GetVisualChild(int index) 
    { 
     return visualChildren[index]; 
    } 

Таким образом, события, правильно проложены.

1

У меня была такая же проблема. Следуя советам MSDN, я рассортировал его для меня:

Удостоверения получают входные события только , как и любые другие элементы FrameworkElement. Поскольку Adorner всегда имеют более высокий Z-порядок, чем элемент его украшает, Adorner принимает входные события (таких как капли или MouseMove), которые могут быть , предназначенные для лежащего в основе украшенной элемента. Адонист может прослушать определенные события ввода и передать их на в базовый украшенный элемент на повторное поднятие события.

Чтобы включить сквозную хит тестирования элементов под Adorner, установите хит тест IsHitTestVisible свойство ложных на Adorner.

В то есть сам Adorner, убедитесь, что IsHitTestVisible = ложь