0

我有一些矩形,我想要实现的是:

用户触摸屏幕,他可以在矩形之间滑动。然后他的手指抬起,最后触摸的矩形被选中。(离开矩形外不会触发任何东西)

就像我的 lumia 920 的键盘一样,一旦你发现你的手指放错了位置,你就可以滑到正确的位置,抬起,屏幕上就会显示正确的字符。

非常感谢你们的英雄!

4

1 回答 1

0

这比看起来更棘手,因为只有在控件上首先触发了 MouseLeftButtonDown 时才会触发 MouseLeftButtonUp 事件。

我看到了两种实现此结果的方法:

  1. 为所有矩形分配相同的 MouseLeftButtonDown 和 MouseLeftButtonUp 事件处理程序。在 MouseLeftButtonDown 中,调用该CaptureMouse方法(它告诉控件继续跟踪鼠标事件,即使光标不再位于控件顶部):

    private void MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        ((UIElement)sender).CaptureMouse();
    }
    

    在 MouseLeftButtonDown 中,释放鼠标,然后使用VisualTreeHelper.FindElementsInHostCoordinates找到触发事件时光标所在的矩形:

    private void MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        var element = (UIElement)sender;
    
        element.ReleaseMouseCapture();
    
        var mouseUpRectangle = VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(this), this.ContentPanel)
            .OfType<Rectangle>()
            .FirstOrDefault();
    
        if (mouseUpRectangle != null)
        {
            Debug.WriteLine("MouseUp in " + mouseUpRectangle.Name);
        }
    }
    

    (将 ContentPanel 替换为您放置所有控件的容器的名称)

  2. 未经测试,但它可能会工作。订阅放置所有矩形的容器的 MouseLeftButtonUp 事件。然后使用相同的逻辑检索指针坐标处的矩形:

    private void MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {                
        var mouseUpRectangle = VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(this), this.ContentPanel)
            .OfType<Rectangle>()
            .FirstOrDefault();
    
        if (mouseUpRectangle != null)
        {
            Debug.WriteLine("MouseUp in " + mouseUpRectangle.Name);
        }
    }
    

你可以在我几个月前写的那篇文章中找到更多信息。

于 2013-08-01T12:06:52.777 回答