在Visual Studio中WPF C#的用户控制移动期间的冲突检测

时间:2017-04-28 13:34:15

标签: c# wpf visual-studio xaml

如果我在C#(Visual Studio中的WPF应用程序)中移动两个UserControl,我希望能够检测到它们之间的冲突。

我目前正在使用“doIntersect”方法,使用if语句显示一个显示“碰撞!”的消息框。

它工作正常,但是,在代码完成执行之前,消息框不会显示,这对我如何编码是有意义的。有没有办法让消息框一旦碰撞就显示,而不是在他们已经相互通过之后?我是否必须在这里实现异步编程?

我目前正在使用一种移动一个物体的方法:

    public static void MoveTo(UserControl FoodX, double X, double Y)
    {
        Vector offset = VisualTreeHelper.GetOffset(FoodX);
        var top = offset.Y;
        TranslateTransform trans = new TranslateTransform();
        FoodX.RenderTransform = trans;
        DoubleAnimation anim1 = new DoubleAnimation(0, 200, TimeSpan.FromSeconds(2));
        trans.BeginAnimation(TranslateTransform.YProperty, anim1);
    }

然后我有我的碰撞代码,我在图像后面放了一个不可见的矩形,所以我可以使用Rect方法:

    public static Rect rectbox;
    public bool Collision()
    {
        rectbox = new Rect(Canvas.GetLeft(rect1), Canvas.GetTop(rect1), rect1.Width, rect1.Height);
        bool doesIntersect = rect1.RenderedGeometry.Bounds.IntersectsWith(FoodImage.rectfood);
        return doesIntersect;
    }

1 个答案:

答案 0 :(得分:2)

我远不是WPF动画的专家,但是因为到目前为止还没有人回复......

TranslateTransform有一个Changed事件,当动画移动UI元素时会触发该事件。您可以使用事件处理程序方法订阅此事件,检查事件处理程序中的冲突,如果检测到冲突,则可以执行所需的操作。

以下代码对我有用,即当移动元素与另一个元素相撞时,消息框会立即显示(我使用包含移动Canvas的{​​{1}}和另一个静态元素进行测试:

UserControl