WPF自定义面板/控件创建——“甜甜圈”

8
我希望创建一个自定义面板或控件,可以创建一个特定类型的项目。基本上,意图是有一个控件,你可以给它一个对象列表,然后它会将每个对象放入一个按钮中。但问题在于这些按钮应该像甜甜圈一样排列成圆形。就像下面的图片一样。现在想象一下,如果每个彩色部分都是一个按钮。他们也会有所有按钮的功能,比如鼠标悬停和事件。所以问题的核心是:我应该寻找什么样的技术来创建这种控件?是否有一种方法对按钮进行某种“曲率”变换?看起来我在这里真的在寻找两件不同的事情,对吧?我的意思是,我可以将列表中的每个项目放入一个ItemTemplate为按钮的ItemsControl中。所以我只需要两件事:第一件事是一个径向布局面板(我已经看到了几个)。第二个是让每个按钮具有某种旋转和曲率变换的方法。有什么想法吗?

您是否打算将通常为矩形的按钮旋转并变形为圆形段,还是只需要使每个项目容器呈该形状,然后包含正常显示的内容(即矩形而不旋转)? - Mike Schenk
我希望实现旋转和变形的按钮。我相信肯特在下面概述了一个非常巧妙的解决方案,可以实现所需的结果。 - Anthony Compton
你能按照你想要的方式使它工作吗? - KornMuffin
我们最终放弃了这个想法,所以我并没有真正实现它的计划。但我坚信,如果你按照以下步骤去做,你会成功的。可能不会像预期那么简单明了,你还需要处理一些问题,比如根据项目数量动态调整按钮大小等,这可能有点棘手(尝试让它们围绕圆形扩展而不是以奇怪的方式增长)。 - Anthony Compton
2个回答

4
我认为您需要考虑以下三个不同的步骤:
  1. 一个Panel,可以在圆形周围布置子元素。重要的是,该面板必须更新其子元素上的只读附加依赖属性,告诉它们被布置的位置(以度数表示的起始位置和结束位置)。
  2. 一个按照某些起始和结束位置呈弧形渲染的Button模板。
  3. 将两者结合起来,将按钮的起始和结束位置绑定到面板公开的附加值。

这听起来是个不错的计划!最难的部分似乎是制作按钮。谢谢,肯特。 - Anthony Compton

0
另一种解决我们遇到的同样问题的方法是使用面板将每个“按钮”堆叠在彼此之上。每个按钮的形状基于两个虚拟圆的计算,内部和外部。然后,它们通过x,y坐标偏移至正确的位置,使其原始位置成为甜甜圈的中心点。最难的部分显然是计算所有这些三角函数,但一旦完成,就可以简单地旋转、扇形展开等来调整形状。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接