0

DockPanel サブクラスの ArrangeOverride メソッドで最初に行うことは、実際の配置を処理する基本実装を呼び出すことです。ただし、ここで「理由」に立ち入ることなく (質問とは関係がないため)、 ArrangeOverrideの基本実装が最後の子の Arrange メソッドに渡した Rect を取得する必要があります。

UIElement をクエリして、Arrange メソッドに渡された 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 が明らかにわかるからです。ただし、どのパネル サブクラスでも機能するコードを作成しようとしています。

4

1 に答える 1

1

私の意見では、リフレクションを使用できます。Arrangeクラス内のメソッドをスパイすると、プライベート フィールド ( と呼ばれる) にメソッド自体のパラメータの値が設定されてUIElementいることがわかります。_finalRectfinalRectArrange

これは常に正しいとは限りません。if 条件によって異なります (コードを確認する必要があるだけです)。_finalRectまた、 private フィールドがプロパティによって返されることにも注意してください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 に答える