【问题标题】:Wpf Adorner not responding to interactionsWpf Adorner 不响应交互
【发布时间】:2011-05-31 14:05:52
【问题描述】:


我正在尝试在 wpf 中创建一个叠加层(背景变暗),类似于您可以在网络上找到的用于弹出图像的叠加层。 我希望它可以在应用程序的多个部分中重复使用,具有不同类型的内容。

这是装饰器类的构造函数的临时代码(只是为了尝试)

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 的 ovverrides 来为装饰者提供被装饰元素的正确大小、GetVisualChild 和 VisualChildCount...

这里的问题是装饰器被正确显示,但没有事件或行为被应用到被装饰的元素上。例如:

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

此处显示了按钮,但我无法单击该按钮,并且对按钮鼠标悬停没有任何影响。 我仍然无法弄清楚问题所在。

【问题讨论】:

    标签: wpf adorner adornerlayer


    【解决方案1】:

    您可能想看看Extended WPF Toolkit 中的ChildWindow 控件。是一个弹出一个带有模态背景效果的Window的控件,你可以指定要放入Window里面的内容。

    【讨论】:

    • 谢谢,这可能是一个更好的解决方案(而且免费),但同时我更愿意了解我的问题是什么
    【解决方案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];
        }
    

    这样事件被正确路由。

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多