我有一个应用程序,它根据放置在表面表上的标记对象创建可变数量的 ScatterviewItems。
ScatterViewItems 基于在数据库中查找的信息以编程方式添加到 ScatterView
Scatterview 在显示此信息方面做得很好
但是,我希望他们成为
均匀分布在桌子上,
没有任何项目重叠
任何想法如何做到这一点?
我有一个应用程序,它根据放置在表面表上的标记对象创建可变数量的 ScatterviewItems。
ScatterViewItems 基于在数据库中查找的信息以编程方式添加到 ScatterView
Scatterview 在显示此信息方面做得很好
但是,我希望他们成为
均匀分布在桌子上,
没有任何项目重叠
任何想法如何做到这一点?
UniformGrid
?
您还可以通过继承来创建自己的面板Panel
。您将在 WPF 博士 ItemsControl 操作指南系列中找到一些非常有价值的信息:http: //drwpf.com/blog/itemscontrol-a-to-z/
这是一个必须阅读的时期。
听起来你需要碰撞检测。
这个问题有两个部分:检测和解决。检测是查看任何项目的边界是否与任何其他项目的边界相交。如果物品是矩形或圆形,这很简单。如果您正在处理其他几何图形,它可能会变得复杂。
解决方案是检测到碰撞后要做的事情。谷歌会帮你找到无数的算法。这是stackoverflow讨论的几个链接:WPF:使用旋转正方形进行碰撞检测,在碰撞解决方法中应用恢复系数,检测精灵之间碰撞的最佳方法?.
您可以实现碰撞以使项目在分散时彼此绑定。根据项目的数量,这可能会导致太多的碰撞,以至于项目不能很好地分散。如果发生这种情况,只需运行一个项目已停止移动的碰撞检测。
ScatterViewItem 具有属性 Center 和 Orientation,您可以使用它们以编程方式定位项目。如果您知道每个项目的大小,您应该能够使用这些属性以适合您情况的任何方式定位它们。通过挂钩每个的 Loaded 事件并检查 ActualWidth/ActualHeight,您可以获得尺寸。如果您可以为所有 SVI 使用固定的初始大小,那就更容易了。
您可以通过计算一个简单的网格(加上一些随机性使其看起来更自然)来布置它们,或者您可能正在寻找所谓的“力导向布局”,它为每个对象提供相对于其大小的排斥力。一段时间后,这些元素自然会彼此均匀间隔,但如果空间不足,它们可能仍会重叠。我还没有看到 WPF 示例,但请参阅flare.prefused.org/demo (layout > force) 了解我在 Flash 中的意思。