按钮的WPF Banana-Like曲线安排

时间:2016-06-20 11:29:33

标签: c# wpf algorithm button

我正在C#中开发一个相对unique WPF Application,我需要以编程方式安排my Buttons(用户可以添加和删除按钮)在我的按钮旁边的香蕉状曲线中,如下所示:

Picture

我用StackPanel尝试了它,但它总是呈矩形,我不知道如何编写算法来动态添加自定义大小的按钮。

tl;博士:任何人都可以帮我找出算法,以动态编程方式排列香蕉状曲线中的按钮吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

创建自己的Panel并使用指数函数将元素放在您想要的位置。这样的事情(没试过):

public class BananaPanel : Panel {

    protected override Size MeasureOverride(Size availableSize) {
        double totalX, totalY;

        foreach (UIElement element in Children) {
            element.Measure(availableSize);
            totalX += element.DesiredSize.Width;
            totalY += element.DesiredSize.Height;
        }
        return new Size(totalX, totalY);
    }

    protected override Size ArrangeOverride(Size finalSize) {
        if(InternalChildren.Count == 0) return finalSize;
        double maxValue = Math.Abs(InternalChildren.Count, 2);
        double ratioX = finalSize.Width / maxValue;
        double ratioY = finalSize.Height / maxValue;
        for(int i=0; i<InternalChildren.Count; i++) {
            UIElement element = InternalChildren[i];

            Point p = new Point(Math.Pow(i, 2)*ratioX, Math.Pow(i, 2)*ratioY); //using square here, so it won't be banana-like, use an exponential function

            element.Arrange(new Rect(p, element.DesiredSize));
        }

        return finalSize;
    }
}

在您的XAML中:

<ItemsControl ItemsSource="{Binding YourBananaItems, Mode=OneWay}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <local:BananaPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

答案 1 :(得分:0)

我根据您的需要对其进行了定制。

你需要的只是一个画布(在我的情况下是(curYear + (int(100) - age))

sc