WPF Mousedown => Нет события MouseLeave - PullRequest
13 голосов
/ 26 сентября 2010

Я создаю элемент управления Windows Presentation Foundation с помощью Microsoft Blend.

Когда я оставляю свой элемент управления нажатием левой кнопки мыши, MouseLeave-Event не вызывается.Почему нет?

Ответы [ 3 ]

7 голосов
/ 12 апреля 2013

Это предполагаемое поведение: когда вы делаете mousedown на элементе управления и выходите из него, элемент управления по-прежнему сохраняет «захват» мыши, то есть элемент управления не будет запускать MouseLeave-Event. Вместо этого будет вызвано событие Mouse-Leave, когда кнопка мыши выйдет за пределы элемента управления.

Чтобы избежать этого, вы можете просто сказать своему управлению НЕ захватывать мышь вообще:

private void ControlMouseDown(System.Object sender, System.Windows.Forms.MouseEventArgs e)
{
    Control control = (Control) sender;
    control.Capture = false; //release capture.
}

Теперь событие MouseLeave будет запускаться даже при выходе из режима, когда нажата кнопка.

Если вам нужен Capture INSIDE the Control, вам нужно приложить больше усилий:

  • Запуск отслеживания положения мыши вручную при нажатии мыши

  • Сравните положение с Top, Left и Size Атрибутами рассматриваемого элемента управления.

  • Решите, нужно ли останавливать элемент управления, захватывающий мышь, или нет.

    public partial class Form1 : Form
    {
    private Point point;
    private Boolean myCapture = false;
    
    public Form1()
    {
        InitializeComponent();
    }
    
    private void button1_MouseDown(object sender, MouseEventArgs e)
    {
        myCapture = true;
    }
    
    private void button1_MouseMove(object sender, MouseEventArgs e)
    {
        if (myCapture)
        {
            point = Cursor.Position;
    
            if (!(point.X > button1.Left && point.X < button1.Left + button1.Size.Width && point.Y > button1.Top && point.Y < button1.Top + button1.Size.Height))
            {
                button1.Capture = false; //this will release the capture and trigger the MouseLeave event immediately.
                myCapture = false;
            }
        }
    }
    
    private void button1_MouseLeave(object sender, EventArgs e)
    {
        MessageBox.Show("Mouse leaving");
    }
    

    }

Конечно, вам нужно остановить собственное отслеживание (myCapture=false;) на MouseUp. Забыли тот :) 1033 *

2 голосов
/ 26 сентября 2010

Когда я не получаю события мыши, я ожидаю, что обычно использую Snoop, чтобы помочь мне понять, что происходит.

Вот пара ссылок:

1- Snoop (утилита WPF)
2- Проект CodePlex для Snoop

1 голос
/ 20 апреля 2013

И для полноты и исторических причин (не щедрость - не имеет смысла иметь два дублирующих вопроса - вам, вероятно, следует переместить его в один, если не слишком поздно) ...

Я сделал основательное решение, используя global mouse hook здесь (подход 2)
WPF: событие отпускания мыши не срабатывает при нажатии мыши

И упростил его использование - вы можете использовать его, привязываясь к командам в вашей модели представления - например,

my:Hooks.EnterCommand="{Binding EnterCommand}"
my:Hooks.LeaveCommand="{Binding LeaveCommand}"
my:Hooks.MouseMoveCommand="{Binding MoveCommand}"

... подробности там

...