В слой украшения WPF не было передано никаких событий

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

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

Мой класс украшения устроен так:

    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);

    }

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


person Johanna    schedule 31.05.2010    source источник
comment
У меня все работает нормально ... вы уверены, что не установили IsHitTestVisible на false на своем украшении?   -  person Thomas Levesque    schedule 31.05.2010
comment
Хммм .. Странно, потому что я получаю это для всех тестовых проектов, которые создаю. Нет, я не установил для IsHitTestVisible значение false. Я тестировал установку как true, так и false, чтобы получить изменение, но ничего не происходит.   -  person Johanna    schedule 01.06.2010


Ответы (2)


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

    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];
    }

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

person nemenos    schedule 29.12.2010

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

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

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

т.е. в самом украшении убедитесь, что IsHitTestVisible = false

person Kev    schedule 06.04.2011