MouseLeftButtonUp: точно пожарная ситуация?
У меня есть несколько прямоугольников, которые я пытаюсь реализовать:
Пользователь может коснуться экрана, он может скользить между прямоугольниками. затем его палец отрывается, и последний коснувшийся прямоугольник выделяется. (Снять внешний прямоугольник ничего не сработает)
Точно так же, как клавиатура моего Lumia 920, когда вы заметили, что ваш палец находится в неправильном месте, вы можете скользить в нужное место, подниматься и показывать правильные символы на экране.
большое спасибо вам, герои!
1 ответ
Это хитрее, чем кажется, так как событие MouseLeftButtonUp будет запущено, только если MouseLeftButtonDown был впервые запущен в элементе управления.
Я вижу два способа достижения этого результата:
Назначьте одинаковые обработчики событий 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); } }
Вы можете найти больше информации в той статье, которую я написал несколько месяцев назад.