MouseLeftButtonUp: точно пожарная ситуация?

У меня есть несколько прямоугольников, которые я пытаюсь реализовать:

Пользователь может коснуться экрана, он может скользить между прямоугольниками. затем его палец отрывается, и последний коснувшийся прямоугольник выделяется. (Снять внешний прямоугольник ничего не сработает)

Точно так же, как клавиатура моего Lumia 920, когда вы заметили, что ваш палец находится в неправильном месте, вы можете скользить в нужное место, подниматься и показывать правильные символы на экране.

большое спасибо вам, герои!

1 ответ

Решение

Это хитрее, чем кажется, так как событие MouseLeftButtonUp будет запущено, только если MouseLeftButtonDown был впервые запущен в элементе управления.

Я вижу два способа достижения этого результата:

  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);
        }
    }
    

Вы можете найти больше информации в той статье, которую я написал несколько месяцев назад.

Другие вопросы по тегам