9

StackPanelの要素が通常とは逆の順序(下から上、右から左など)で表示されるように、宣言的にtrueに設定できるプロパティを使用してカスタムStackPanelを作成したいと思います。ReverseOrderその場でリバーシブルである必要があります。

StackPanelから新しいクラスを派生させることを考えていますが、オーバーライドするメソッドを知る必要があります。

最終的解決:

protected override System.Windows.Size ArrangeOverride( System.Windows.Size arrangeSize ) {
    double x = 0;
    double y = 0;

    IEnumerable<UIElement> children = ReverseOrder ? InternalChildren.Cast<UIElement>().Reverse<UIElement>() : InternalChildren.Cast<UIElement>();
    foreach ( UIElement child in children ) {
        var size = child.DesiredSize;
        child.Arrange( new Rect( new Point( x, y ), size ) );

        if ( Orientation == Orientation.Horizontal )
            x += size.Width;
        else
            y += size.Height;
    }

    if ( Orientation == Orientation.Horizontal )
        return new Size( x, arrangeSize.Height );
    else
        return new Size( arrangeSize.Width, y );
}

また、定義して登録し、変更された場合はReverseOrder呼び出します。UpdateLayout

4

3 に答える 3

12

FrameworkElement.ArrangeOverrideを再実装し、必要に応じて通常とは逆の順序ですべての子を呼び出すことができます。

http://msdn.microsoft.com/en-us/library/system.windows.uielement.arrange.aspx

このようなもの(テストされていません):

    double x = 0;
    double y = 0;

    var children = ReverseOrder ? InternalChildren.Reverse() : InternalChildren;
    foreach (UIElement child in children)
    {
        var size = child.DesiredSize;
        child.Arrange(new Rect(new Point(x, y), size));

        if (Orientation == Horizontal)
            x += size.Width;
        else
            y += size.Height;
    }

ReverseOrderプロパティを変更した後は、必ずUpdateLayoutを呼び出してください。

于 2010-08-07T00:25:56.857 に答える
3

MeasureOverrideArrangeOverride

実際には、測定ロジックはStackPanelと同じである可能性があるため、ArrangeOverrideをオーバーライドできる場合があります。StackPanelにはスクロールを処理するロジックがあり、自分で作成する場合は複製する必要があることに注意してください。Panelから直接継承し、スクロールをサポートしないようにすることをお勧めします。

パネルのMSDNページのカスタムパネル要素、またはWPFチュートリアル-カスタムパネルコントロールの作成やWPFでのカスタムパネルの作成などのカスタムパネルの作成に関するさまざまなブログエントリを参照してください。

于 2010-08-07T00:26:49.060 に答える