gpt4 book ai didi

c# - 在 WPF 中构建可逆的 StackPanel

转载 作者:太空狗 更新时间:2023-10-29 17:41:04 25 4
gpt4 key购买 nike

我想构建一个带有 ReverseOrder 属性的自定义 StackPanel,我可以声明性地将其设置为 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;
}

确保在更改 ReverseOrder 属性后调用 UpdateLayout。

关于c# - 在 WPF 中构建可逆的 StackPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3428622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com