C # WPF - Adorner ZIndex - PullRequest
       42

C # WPF - Adorner ZIndex

0 голосов
/ 26 октября 2011

У меня есть Сетка с Adorner, чтобы предоставить какой-то нарисованный рисунок.Смотрите img: http://imgur.com/D649W

Моя проблема в том, что этот Adorner (точки на сетке) расположен поверх всего.Белый квадрат перетаскивается, но теперь, когда Adorner находится сверху, я не могу перетащить.Мне бы хотелось, чтобы слой находился позади каждого компонента, добавляемого в сетку.Любые предложения о том, как я могу установить 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 ]

1 голос
/ 26 октября 2011

Простой и грязный способ убедиться, что нужные элементы ВСЕГДА находятся сверху:

Объявление статического в библиотеке Util:

      public static int ZIndexCount;

Тогда, когда вам нужен элемент сверху, вы просто делаете:

         SetZIndex(_viewbox, Util.ZIndexCount++);

Конечно, если ваше приложение работает без перерыва в течение 5 лет, ZIndexCount вернется к 0 ...

Это работает как брелок в моих приложениях.

1 голос
/ 08 августа 2013

Если ваша проблема в том, что рекламодатель закрывает элементы, которыми вы хотите манипулировать, чтобы они стали не перетаскиваемыми и т. Д., Установите .IsHitTestVisible = False на рекламодателе.

Вы также можете установить непрозрачность для рекламодателя на какое-то полупрозрачное значение, чтобы видеть фон через него, если это желательно.

0 голосов
/ 08 октября 2015

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

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

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

0 голосов
/ 26 октября 2011

Это то, что вы ищете?

Panel.SetZIndex(ad, 20)

Прикрепленные свойства фреймворка обычно присваиваются из статических методов UIElement, который его содержит.

РЕДАКТИРОВАТЬ:
Возможная альтернатива: - создать свою собственную панель

...