我想制作一个简单的匹配游戏,以帮助更好地理解运动,其中我将有一个形状和形状本身的轮廓。将形状拖动到其轮廓上并释放它以使其卡入到位。听起来很简单。我可以使用ManipulationDelta事件移动我的形状,但有些原因我无法触发任何拖动事件(DragOver,DragEnter,Drop)。我已经阅读了这些事件,但也许我的理解是有缺陷的。为了知道什么时候将一个形状拖到另一个形状上,我在寻找什么事件?
XAML
<Canvas Name="DrawCanvas">
<Ellipse Name="Shape1" Fill="SteelBlue" Height="200" Width="200" ManipulationMode="All" AllowDrop="True" DragOver="Shape1_DragOver" DragEnter="Shape2_DragEnter" Drop="Shape1_Drop"/>
<Ellipse Name="Shape2" Height="209" Width="209" Stroke="SteelBlue" StrokeThickness="5" AllowDrop="True" Canvas.Left="594" Canvas.Top="96" />
</Canvas>
我已尝试过Shape1和Shape2上的DragOver,DragEnter,Drop事件的每个组合,但它们似乎永远不会触发。这些事件不适用于形状吗?或者,当使用ManipulationDelta进行移动时,它们可能不起作用吗?
谢谢,我真的很感激任何帮助或指导。
答案 0 :(得分:1)
答案是获得画布的边界,形状的大小以及X,Y。从那里你可以得到它周围的4个点(topLeft,topRight,bottomLeft,bottomRight)。当一个点超过你在LiveFdelta事件中的边界时,将其设置为该边界。这有效地保持了形状“在界限内”。
translation.X = e.Delta.Translation.X;
translation.Y = e.Delta.Translation.Y
// Since we are checking the left point subtract your shapes width from the canvas right
// bounds. If X is greater than this set it instead to that maximum bound.
if (translation.X > (canvasright - shape.Width))
translation.X = canvasright - shape.Width;
/// Same for top. If Y is less than the canvas top set it instead right at the boundary.
if (translation.Y < canvastop)
translation.Y = canvastop;
// Do the same for bottom and left
也可以使用形状中心来执行此操作,这可能会根据您实现的功能提供优势。使用中心时,您的计算顶部或底部的形状是高度的一半,左右是其宽度的一半。