Я хотел бы создать собственный 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
, если он изменится.
Вы можете повторно реализовать 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.
MeasureOverride и ArrangeOverride
На самом деле, ваша логика измерения может быть такой же, как и у StackPanel, поэтому вы можете просто переопределить ArrangeOverride. Имейте в виду, что StackPanel имеет некоторую логику для обработки прокрутки, которую вам, возможно, придется дублировать, если вы будете писать ее самостоятельно. Возможно, вы захотите унаследоваться непосредственно от Panel и не пытаться поддерживать прокрутку.
Смотрите Элементы пользовательских панелей на странице MSDN, посвященной панелям, или различные записи в блоге о создании пользовательских панелей, например WPF Tutorial - Creating A Custom Panel Control или Creating Custom Panels In WPF.