MouseLeftButtonUp:确切的火情?

时间:2013-08-01 11:45:31

标签: windows-phone-8 interaction mouseleftbuttonup

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

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

就像我的lumia 920的键盘一样,一旦你发现手指在错误的位置,你就可以滑到正确的位置,抬起,并在屏幕上显示正确的角色。

非常感谢你的英雄们!

1 个答案:

答案 0 :(得分: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);
        }
    }
    
  3. 您可以在几个月前写的that article中找到更多信息。