Wpf Adorner не отвечает на взаимодействия
Я пытаюсь создать наложение в wpf (с затемненным фоном), подобное тем, которые вы можете найти в Интернете для всплывающих изображений. Я хотел бы, чтобы его можно было повторно использовать в более чем 1 части приложения с различными типами контента.
это временный код конструктора класса 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"}));
Кнопка здесь показана, но я не могу нажать кнопку, и никакие эффекты при наведении мыши не применяются. Я до сих пор не могу понять проблему.
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];
}
Таким образом, события правильно маршрутизируются.
Возможно, вы захотите взглянуть на элемент управления ChildWindow в Extended WPF Toolkit. Это элемент управления, который открывает окно с модальным фоновым эффектом, и вы можете указать содержимое для размещения внутри окна.