0

在 DockPanel 子类的 ArrangeOverride 方法中,我们要做的第一件事是调用基本实现,因为它是处理实际排列的人。但是,这里不讨论“为什么”(因为它与问题无关),然后我们需要获取 ArrangeOverride 的基本实现传递给最后一个孩子的 Arrange 方法的 Rect。

有什么方法可以查询 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。但是,我们正在尝试编写可以与任何面板子类一起使用的代码。

4

1 回答 1

1

在我看来,您可以使用反射。通过窥探类Arrange中的方法,UIElement您会发现使用方法本身的参数_finalRect值设置了一个私有字段(称为 ) 。finalRectArrange

这并不总是正确的:它取决于一些 if 条件(您只需要查看代码)。您还可以注意到_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;
}

现在我不知道你的确切问题是什么,但我希望这个提示可以帮助你解决它。

于 2016-02-14T20:01:15.607 回答