Я создаю элемент управления Windows Presentation Foundation с помощью Microsoft Blend.
Когда я оставляю свой контроль, нажимая левую кнопку мыши, MouseLeave-Event не поднимается. Почему бы и нет?
Я создаю элемент управления Windows Presentation Foundation с помощью Microsoft Blend.
Когда я оставляю свой контроль, нажимая левую кнопку мыши, MouseLeave-Event не поднимается. Почему бы и нет?
Это предполагаемое поведение. Когда вы выполняете 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. Забыл тот:)
Когда я не получаю события мыши, я ожидаю, что я обычно использую Snoop, чтобы помочь мне понять, что происходит.
Вот несколько ссылок:
И для полноты и исторических причин (а не для награды) не имеет смысла иметь два повторяющихся вопроса - вы должны перенести их на один, если не слишком поздно)...
Я сделал тщательное решение, используя
global mouse hook
здесь (подход 2)
WPF: событие мыши не запускается с нажатием мыши
И упростить его использование - вы можете использовать его, привязывая к командам в вашей модели представления - например.
my:Hooks.EnterCommand="{Binding EnterCommand}"
my:Hooks.LeaveCommand="{Binding LeaveCommand}"
my:Hooks.MouseMoveCommand="{Binding MoveCommand}"
... подробнее там