在DockPanel子类的ArrangeOverride方法中,我们要做的第一件事是调用基本实现,因为它是由谁来处理实际安排的。但是,在这里不讨论“为什么”(因为它与问题无关),我们需要得到基本实现 of ArrangeOverride传递给最后一个子级的安排方法的Rect。
是否有任何方法查询UIElement,以查看向其安排方法传递了什么rect?
比如说..。
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使用了什么。但是,我们正在尝试使用与任何面板子类一起工作的代码。
发布于 2016-02-14 20:01:15
在我看来,你可以使用反射。通过监视Arrange类中的UIElement方法,您会发现使用Arrange方法本身的finalRect参数值设置了一个私有字段(称为_finalRect)。
这并不总是正确的:它取决于一些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;
}现在我不知道你的确切问题是什么,但我希望这个提示能帮助你解决这个问题。
https://stackoverflow.com/questions/35385301
复制相似问题