Wpf Adorner не отвечает на взаимодействие


Я пытаюсь создать наложение в wpf (с затемнением фона), подобное тем, которые вы можете найти в Интернете для всплывающих изображений. Я хотел бы, чтобы его можно было повторно использовать более чем в одной части приложения с разными типами контента.

это временный код конструктора класса adorner (просто попробовать)

private readonly Grid _grid = new Grid();

public DarkOverlayAdorner(UIElement adornedElement, Object content) :
        base(adornedElement)
{
     _grid.Background = new SolidColorBrush(Color.FromArgb(99, 0, 0, 0));
     IsHitTestVisible = true;
     var visual = content as UIElement;
     if (visual != null)
        _grid.Children.Add(visual);
}

Кроме того, в классе (конечно) у меня есть овверриды MeasureOverride и ArrangeOverride, чтобы придать украшению правильный размер украшенного элемента, GetVisualChild и VisualChildCount...

Проблема здесь в том, что декоративный элемент отображается правильно, но к нему не применяются никакие события или поведение. Например:

AdornerLayer layer = AdornerLayer.GetAdornerLayer(textBoxProva);
layer.Add(new DarkOverlayAdorner(textBoxProva, new Button{Content = "prova"}));

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


person nemenos    schedule 28.12.2010    source источник


Ответы (2)


Хорошо, я потерял много времени, пытаясь понять, в чем проблема. В итоге нашел решение:

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

    VisualCollection visualChildren;
    FrameworkElement @object;

    public DarkOverlayAdorner(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

Вы можете взглянуть на элемент управления ChildWindow в Расширенный набор инструментов WPF. Это элемент управления, который открывает окно с модальным фоновым эффектом, и вы можете указать содержимое, которое нужно поместить в окно.

person Community    schedule 28.12.2010
comment
спасибо, это было, вероятно, лучшее решение (и бесплатное), но пока я предпочел понять, в чем проблема у меня - person nemenos; 29.12.2010