我有一些矩形,我想要实现的是:
用户触摸屏幕,他可以在矩形之间滑动。然后他的手指抬起,最后触摸的矩形被选中。(离开矩形外不会触发任何东西)
就像我的 lumia 920 的键盘一样,一旦你发现你的手指放错了位置,你就可以滑到正确的位置,抬起,屏幕上就会显示正确的字符。
非常感谢你们的英雄!
我有一些矩形,我想要实现的是:
用户触摸屏幕,他可以在矩形之间滑动。然后他的手指抬起,最后触摸的矩形被选中。(离开矩形外不会触发任何东西)
就像我的 lumia 920 的键盘一样,一旦你发现你的手指放错了位置,你就可以滑到正确的位置,抬起,屏幕上就会显示正确的字符。
非常感谢你们的英雄!
这比看起来更棘手,因为只有在控件上首先触发了 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);
}
}
你可以在我几个月前写的那篇文章中找到更多信息。