MouseLeftButtonUp: точное условие пожара?

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

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

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

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


person Yinthewind    schedule 01.08.2013    source источник


Ответы (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);
        }
    }
    

Дополнительную информацию можно найти в эту статью я написал несколько месяцев назад.

person Kevin Gosse    schedule 01.08.2013
comment
В целом это работает, кажется, есть много странного поведения с мышью. - person Yinthewind; 02.08.2013
comment
но возникли еще две проблемы: 1. после MouseCapture MouseEnter не будет работать во время скольжения, 2. каждое нажатие будет запускать MouseLeftButtonUP 2 раза... - person Yinthewind; 02.08.2013
comment
Вы пробовали второе решение? Он не использует MosueCapture, поэтому может решить проблему с MouseEnter. - person Kevin Gosse; 02.08.2013