Как вы можете передать Rect методу Arrange UIElement во время базовой реализации ArrangeOverride для любого данного подкласса панели?

В методе ArrangeOverride подкласса DockPanel первое, что мы делаем, это вызываем базовую реализацию, поскольку именно она обрабатывает фактическое расположение. Однако, не вдаваясь в "почему" здесь (поскольку это не имеет отношения к вопросу), нам нужно получить Rect, который базовая реализация ArrangeOverride передала методу Arrange последнего дочернего элемента.

Есть ли способ запросить UIElement, чтобы увидеть, какой прямоугольник был передан его метод Arrange?

Например...

protected override Size ArrangeOverride(Size arrangeSize)
{
    // Perform default arrangement
    var retVal = base.ArrangeOverride(arrangeSize);

    // Get the last element (if any)
    var lastElement = Children.OfType<UIElement>().LastOrDefault();

    // Get the Rect passed to the lastElement in the base.ArrangeOverride call
    var lastElementArrangeRect = (lastElement != null)
         ? lastElement.ArrangeRect // <-- This is what we're looking for
         : new Rect();

    return retVal;
}

Единственный найденный нами способ - это заново реализовать ArrangeOverride, так как мы бы тогда точно знали, что используется Rect. Однако мы пытаемся создать код, который будет работать с любым подклассом панели.

1 ответ

На мой взгляд, вы можете использовать отражение. Следите за Arrange метод в UIElement класс вы обнаружите, что личное поле (называется _finalRect) устанавливается со значением finalRect параметр Arrange сам метод.

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

Теперь все, что вам нужно, это статический вспомогательный метод для получения значения этого свойства:

public static Rect GetPreviousArrangeRect(UIElement element)
{
    Type elementType;
    PropertyInfo propertyInfo;

    if (element != null)
    {
        elementType = element.GetType();
        propertyInfo = elementType.GetProperty("PreviousArrangeRect",
            BindingFlags.Instance | BindingFlags.NonPublic);

        return (Rect)propertyInfo.GetValue(element, null);
    }

    return Rect.Empty;
}

Сейчас я не знаю, в чем именно заключается ваша проблема, но я надеюсь, что эта подсказка поможет вам в ее решении.

Другие вопросы по тегам