Используя более 144 украшателей - PullRequest
5 голосов
/ 01 февраля 2012

Похоже , что максимальное количество украшений, которые работают без поломок, равно 144.

У меня есть ScrollView с кучей объектов, и многие из них поставляются с украшениями. Первые 144 украшения расположены правильно, а остальные нет. Обратите внимание, что это исключительная ситуация, когда их так много; обычно там ровно ноль украшателей. Тем не менее, я бы хотел, чтобы это работало должным образом даже в этом исключительном случае.

Если оставить в стороне, как этот произвольный (и очень низкий) лимит заставляет меня чувствовать, есть ли практические обходные пути для этой ошибки?

Ответы [ 3 ]

3 голосов
/ 23 марта 2012

В настоящее время нет никакого известного способа сделать это.

Что также хорошо, потому что я нашел, что производительность была плохой; простое создание подкласса моего элемента управления Image, который должен был отображать рекламный элемент, и отрисовка оверлея в OnRender работала намного лучше (и в отличие от WinForms визуальный элемент может выходить за пределы логической границы элемента управления).

2 голосов
/ 15 ноября 2016

Вот сценарий, при котором мне удалось реализовать тренировку для этой проблемы:

У меня есть несколько текстовых полей, которые связаны с документом Excel.Текстовые поля принимают числовое значение.Они установлены, чтобы сделать недействительными ошибки данных в коде xaml.Ошибка данных происходит, если число <1 или ноль.Я поместил AdornerDecorator вокруг текстового поля (чтобы красная рамка недействительности правильно отображалась над текстовым полем).В Excel вы можете изменить все текстовые поля одновременно, но, как обнаружил ОП, если вам удастся сделать недействительными более 144 текстовых полей одновременно, декоратор-декоратор начнет воспроизводиться, смещая положение границ (то же самоеон был спроектирован для исправления в первую очередь). </p>

Я пробовал несколько различных решений, включая аннулирование макета, однако ни одно из них не помогло в ситуации, с которой я столкнулся.Используя Snoop, я обнаружил, что если я обновлю текстовое поле вручную, тогда рекламодатель разместится правильно.Итак, я решил вызвать обновление для макета каждого отдельного текстового поля, в котором нуждался рекламодатель.Я сделал это, прослушивая OnValueUpdated в текстовых полях.Если новое значение, которое он обновлял до полученного, оказалось недействительным, я навязываю «UpdateLayout ()» для текстового поля (я хотел сделать это только для недопустимых значений, поскольку принудительное обновление влияет на производительность, и я не хочуделайте это каждый раз, когда значение меняется).

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

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

Это может быть слишком поздно для вечеринки здесь, но это, похоже, решило проблему для меня. Я держал список украшателей, которые я добавил в слой украшений (называемый m_adorners), и в корневом элементе управления, где содержались мои украшатели, я присоединяюсь к событию LayoutUpdated. Вот обработчик события:

    private void OnLayoutUpdated(object sender, EventArgs e)
    {
        if (m_adorners.Any(a => !a.IsArrangeValid && 
               a.Parent != null))
        {
            AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(this);
            adornerLayer.InvalidateArrange();
        }
    }
...