2014-11-01 2 views
0

У меня есть окно WPF, в котором я подписываться на мыши вниз события, когда пользователь щелкает в любом месте, даже за пределами окна:MouseDown событий прекратить огонь в окне WPF

void RightClickWindow_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    try 
    { 
     base.OnMouseDown(e); 
     Point mousePositionInApp = Mouse.GetPosition(this); 
     Point mousePositionInScreenCoordinates = PointToScreen(mousePositionInApp); 
     if (mousePositionInScreenCoordinates.X < Left || mousePositionInScreenCoordinates.X > Left + Width || mousePositionInScreenCoordinates.Y < Top || mousePositionInScreenCoordinates.Y > Top + Height) 
     { 
      Close(); 
     } 
    } 
    catch { } 
} 

void RightClickWindow_Activated(object sender, EventArgs e) 
{ 
    Mouse.Capture(this, CaptureMode.SubTree); 
} 

Если щелчок вне границ , Я увольняю окно. Это хорошо работает, за исключением одного специального случая, который я пытаюсь исправить, но не могу понять, как это сделать. Вот где он перестает работать:

У меня есть простой WPF Button в XAML. Если я щелкнул левой кнопкой мыши по этой кнопке, и пока мышь не работает, я перетаскиваю курсор за пределы рамки, а затем отпускаю левую кнопку мыши, эти события захвата больше не срабатывают. Почему это, и как я могу исправить свой код для этого особого случая?

+0

Вы имеете в виду, что они больше не стреляют в случае, когда вы отпускаете кнопку, или что они больше не срабатывают * когда-либо *? – furkle

+0

Они больше не стреляют * никогда *. – Alexandru

+0

проблема заключается в том, что ваше окно теряет захват мыши. Чтобы воспроизвести вашу проблему, у нас есть другие способы, такие как попытка сосредоточиться на любых элементах внутри вашего окна, а затем попробовать щелкнуть за окном, он не будет закрыт, как ожидалось, потому что потерян захват мыши. Я думаю, вы не должны пытаться делать что-то подобное, его поведение очень ненадежно. Когда ваше окно имеет захват мыши все время, вы не можете нормально обрабатывать панель заголовка (не можете взаимодействовать с ним). Сначала вы должны сфокусировать некоторый элемент в своем окне, прежде чем сможете перетащить панель заголовка. Затем окно теряет захват мыши ... –

ответ

1

Когда вы нажмете Button, Window проиграет захват мыши, поэтому событие MouseDown больше не вызывается. Закрытие на мероприятии Deactivate должно работать для вашего сценария.

+1

Намного проще просто переопределить событие «Деактивировано», подобное этому и Закрыть. Спасибо! Конечно, мне пришлось добавить несколько проверок параллелизма, чтобы убедиться, что окно еще не закрывается, переопределяя событие OnClosing, но это ничего. :) – Alexandru

Смежные вопросы