Должен ли я использовать AdornerLayer, чтобы избежать обрезки моего рекламного объявления вне экрана? - PullRequest
3 голосов
/ 04 августа 2010

Я пишу код WPF с участием Adorners.Я использую файл UIElementAdorner.cs Джоша Смита (см. Проект в его блоге по инфраструктуре ).Я украшаю рекламный текст.Мне нужно аккуратно разместить своего рекламодателя, чтобы он не отрывался от экрана.

Какой лучший способ узнать, собираюсь ли я обрезать?

Я использую следующий код для создания и размещения своего рекламодателя.У меня странное чувство, что, основываясь на том, скопирую я AdornerLayer или нет, это не лучший вариант.

var infoBubble = new InfoBubble {InformationText = @"I like cheese."};
var adornedElementRect = new Rect(Target.DesiredSize);
var layer = AdornerLayer.GetAdornerLayer(Target);

var adorner = new UiElementAdorner<Control>(Target) { Child = infoBubble };
adorner.Measure(new Size(layer.ActualWidth, layer.ActualHeight));

var adornerRect = new Rect(adorner.DesiredSize);
var top = -1*(adornerRect.Height);
var left = adornedElementRect.Width/2;

// Using layer to judge where to place the adorner
var upperLeftPoint = Target.TranslatePoint(new Point(left, top), layer);
var lowerRightPoint = Target.TranslatePoint(new Point(left + adornerRect.Width, 
    top + adornerRect.Height), layer);

if (upperLeftPoint.Y < 0) top -= upperLeftPoint.Y; // shift down by Y
if (lowerRightPoint.X > layer.ActualWidth) 
    left  -= (lowerRightPoint.X - layer.ActualWidth); // shift left

Имейте в виду, что этот код содержится в TargetedTriggerAction , который, как ожидается, будут использовать дизайнеры (также известные как пользователи Blend), когда они хотят, чтобы информация всплывала над некоторыми элементами пользовательского интерфейса.Таким образом, этот код будет очень мало знать об элементе, который нужно украсить, или его среде.

1 Ответ

2 голосов
/ 11 августа 2010

Да, это лучший ответ, который я могу различить.

Согласно дальнейшим прочтениям и некоторым экспериментам, при вызове GetAdornerLayer мы получаем самый нижний уровень над целевым элементом управления в визуальном дереве.Это означает, что мы можем получить слой ниже слоя AdornerDecorator , определенного в шаблоне окна.Этот нижний AdornerDecorator может иметь ClipToBounds = "True" (я не знаю почему, но это возможно).

Зная эту информацию, я могу быть относительно уверен, что AdorneLayer, в который я рисую, является лучшим ограничивающим прямоугольникомза то, что я рисую.Я мог бы иметь возможность рисовать за пределами этого поля (например, если ClipToBounds был False на AdornerDecorator ниже, чем у окна), но я не должен рассчитывать на эту способность.

...