我有一些矩形,我想要实现的是:
用户触摸屏幕,他可以在矩形之间滑动。然后他的手指抬起,并选择最后一个触摸的矩形。 (抬起外面的矩形不会触发任何东西)
就像我的lumia 920的键盘一样,一旦你发现手指在错误的位置,你就可以滑到正确的位置,抬起,并在屏幕上显示正确的角色。
非常感谢你的英雄们!答案 0 :(得分:0)
这比看起来更棘手,因为只有在控件上首次触发MouseLeftButtonDown时才会触发MouseLeftButtonUp事件。
我看到两种方法来实现这个结果:
将相同的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替换为放置所有控件的容器名称)
未经测试但可能有效。订阅容器的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);
}
}
您可以在几个月前写的that article中找到更多信息。