WPF Mousedown => Нет события MouseLeave

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

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

Ответы

Ответ 1

Это предполагаемое поведение. Когда вы выполняете mousedown на элементе управления и оставляете элемент управления, элемент управления STILL сохраняет свой "захват" на мыши, то есть элемент управления не запускает MouseLeave-Event. Событие Mouse-Leave будет запущено, как только Mousebutton будет выпущен за пределами элемента управления.

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

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

Теперь событие MouseLeave будет запущено даже при перемещении при нажатии кнопки.

Если вам требуется Capture INSIDE 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. Забыл тот:)

Ответ 2

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

Вот несколько ссылок:

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

Ответ 3

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

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

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

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

... подробнее там