Создание обратимой StackPanel в WPF

Я хотел бы создать собственный StackPanel со свойством ReverseOrder , которому я могу декларативно установить значение true, чтобы элементы в StackPanel отображались в обратном порядке. нормального (например, снизу вверх или справа налево). Он должен быть обратимым на лету.

Я подумываю создать новый класс из 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 , если он изменится.

9
задан devios1 7 August 2010 в 01:25
поделиться

2 ответа

Вы можете повторно реализовать FrameworkElement.ArrangeOverride и вызывать все child.Arrange в обратном порядке, чем обычно, когда это необходимо.

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;
    }

Убедитесь, что вы вызываете UpdateLayout после изменения свойства ReverseOrder.

12
ответ дан 4 December 2019 в 13:44
поделиться

MeasureOverride и ArrangeOverride

На самом деле, ваша логика измерения может быть такой же, как и у StackPanel, поэтому вы можете просто переопределить ArrangeOverride. Имейте в виду, что StackPanel имеет некоторую логику для обработки прокрутки, которую вам, возможно, придется дублировать, если вы будете писать ее самостоятельно. Возможно, вы захотите унаследоваться непосредственно от Panel и не пытаться поддерживать прокрутку.

Смотрите Элементы пользовательских панелей на странице MSDN, посвященной панелям, или различные записи в блоге о создании пользовательских панелей, например WPF Tutorial - Creating A Custom Panel Control или Creating Custom Panels In WPF.

3
ответ дан 4 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: