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