C#WPF - Adorner ZIndex

时间:2011-10-26 11:03:25

标签: c# wpf grid adorner

我有一个带有装饰器的网格来提供一些绘制的图案。见img:http://imgur.com/D649W

我的问题是,这个Adorner(网格上的点)是在所有内容之上。白色方块是可拖动的,但现在当Adorner位于顶部时,我无法拖动。我希望该层位于添加到Grid的每个组件的后面。关于如何设置ZIndex的任何建议?

感谢。

以下代码:

  MyAdorner ad = new MyAdorner(grid);
  AdornerLayer adLayer = AdornerLayer.GetAdornerLayer(grid);
  adLayer.Add(ad);

我按下按钮,这就是将MyAdorner添加到网格中。 MyAdorner看起来像这样:

public MyAdorner(Grid adornedGrid)
: base(adornedGrid) {
Height = adornedGrid.Height;
Width = adornedGrid.Width;
brush = new VisualBrush();
brush.Stretch = Stretch.Fill;
brush.TileMode = TileMode.Tile;
brush.Viewport = new Rect(0, 0, SnapDistance, SnapDistance);
brush.ViewportUnits = BrushMappingMode.Absolute;
brush.Viewbox = new Rect(0, 0, SnapDistance, SnapDistance);
brush.ViewboxUnits = BrushMappingMode.Absolute;
ellipse = new Ellipse() { Fill = new SolidColorBrush(Colors.Blue), Width = 2, Height = 2 };
brush.Visual = ellipse;
}

protected override void OnRender(System.Windows.Media.DrawingContext drawingContext) { 
Pen renderPen = new Pen(new SolidColorBrush(Colors.Black), 0); 
drawingContext.DrawRectangle(brush, renderPen, new Rect(new Point(0, 0), AdornedElement.DesiredSize)); 
}

4 个答案:

答案 0 :(得分:1)

简单而肮脏的方式,以确保您想要的元素总是在顶部:

在Util库中声明一个静态:

      public static int ZIndexCount;

然后当你想要一个元素在上面时,你只需:

         SetZIndex(_viewbox, Util.ZIndexCount++);

当然,如果您的应用程序运行5年而没有被中断,ZIndexCount将返回0 ...

它在我的应用程序中就像一个魅力。

答案 1 :(得分:1)

如果您的问题是装饰器覆盖了您想要操作的元素以使它们变得不可拖动等,请在装饰器上设置.IsHitTestVisible = False

您还可以将装饰者的不透明度设置为某个半透明值,以便在需要时通过它查看背景。

答案 2 :(得分:0)

这是你要找的吗?

Panel.SetZIndex(ad, 20)

框架的附加属性通常可以从包含它的UIElement的静态方法中找到。

修改
可能的选择: - make your own Panel

答案 3 :(得分:0)

我知道这已经很老了,但我想我还是试着: 您可以向可视树层次结构添加新的AdornerDecorator,以便在适当的级别呈现控件。默认情况下,树的根提供AdornerDecorator,但您可以根据需要添加任意数量,并且您添加的组件将在其中呈现。有关更多信息 - 请参阅此处

  <Grid>
     <AdornerDecorator>
        ...your Adorners render here
     </AdornerDecorator>
 </Grid>

https://wangmo.wordpress.com/2008/10/19/relations-between-adorner-adornerlayer-and-adornerdecorator/