“捕捉”指南

问题描述:

因此,我在WPF中创建了此窗口编辑器,该窗口编辑器可以帮助我快速创建窗体。现在,我所研究的一个功能就是创建指南工具。在它的核心,它只是创建线条来帮助保持我的UI元素在屏幕上组织。我会告诉你一个例子。漫长的黑线是我之前谈到的指导方针。现在“捕捉”指南

enter image description here

,我注意到,在很多文艺节目(即Photoshop中)和实现形式流行的IDE,他们有一个“捕捉到”特征,其中一个UI元素将捕捉到一条线UI或到另一个UI元素以保持对齐。事情是这样的:

enter image description here

我已经有了指引显示我的编辑了。现在,我想要帮助理解的是,我将如何执行“捕捉到”功能?我没有要求代码,只是一个故障(视觉故障将是最受欢迎的)。

这是我的问题:

  1. 如何对象知道,如果它的边缘(上,下,左,右)触及行吗?
  2. 如果用户不断移动鼠标超过指南,我将如何知道如何解除UI元素的绑定?
  3. 如果我有(说)10行,我如何确保对象连接到最近的行?

UPDATE

enter image description here

+2

当对象移动或调整大小时,请跟踪其相对于鼠标的实际大小/位置,并分别跟踪相同信息的快照版本。如果给定的实际边缘在一行的任意距离内 - 比如说4个像素(真的是WPF单位)。如果它在该距离内,则将其设置为它接近的线的值。您仍然拥有* actual *鼠标相对值,因此如果用户不断拖动它并且离开该4单元区域,您就知道要将其取消。找到对齐线很容易 - 再次使用'%'。 –

+0

当用户拖动对象并且对象的边缘靠近线条时(例如10像素或更少或20像素等),将其对齐(即 - 立即移动到线条上)当用户拖动对象时 - 不要移动它直到达到相同的距离,然后立即将它移出到那个距离(unsnap)。 – Evk

+1

@ Ed Plunkett YYour逻辑是有声的!我实现了它,它的工作原理!非常感谢! – user3838697

当物体移动或调整大小,记录其实际相对于鼠标尺寸/位置的,并分别保持相同的捕获的版本轨道信息。如果给定的实际边缘在一行的任意距离内 - 比如说4个像素(真的是WPF单位)。如果它在该距离内,则将其设置为它接近的线的值。您仍然具有实际的鼠标相对值,因此如果用户一直拖动它并且离开该4单元区域,则知道要将其取消。

当一个对象被调整大小时,边界框的最多两个边将会改变位置(假设您可以拖动边角以及边)。当您移动物体时,边界框的所有四个边都会移动。

因此,您需要跟踪哪些边缘正在移动,并且只对这些边缘进行咬合线接近测试。当你移动一个物体时,将左边或者顶边捕捉到一条线很容易。这只是对象的位置。但是,如果你捕捉到一条线的右侧或顶部边缘,你设置

snappedPos.X = nearestVerticalSnapLine.X - draggedObject.Width; 

snappedPos.Y = nearestHorizontalSnapLine.Y - draggedObject.Height; 

您还可能有情况相对边缘都将是接近台词:你说正在将十个单位的正方形拖到十个单位的网格上。当它位于网格框内时,所有四条边将接近网格线。哪个胜利?更近的一个。

定位捕捉线很容易 - %

+0

最后一件事:我该如何测试如果UI对象触及顶部或底部的水平线?并再次感谢第一个答案,这有助于很多! – user3838697

+0

很高兴为您提供帮助。您是什么意思,“顶部或底部水平线”?您的意思是物体的底部是触摸下面的线,还是顶部触摸上面的线? –

+0

正确,比方说我的物体的底部正在触摸顶部线,然后我想将它锚定到底部。我希望我可以附加图像 – user3838697