2012-04-24 3 views
1

Можно ли проверить, когда пользователь нажал вне модального окна? Я бы хотел как-то обойти модальную логику, потому что, если окно не отображается как модальное, оно не будет отображаться поверх активного окна, и пока это единственный способ отобразить его правильно. Я не нашел подходящего способа сделать это (поскольку событие «деактивировать» больше не будет срабатывать ..)Перехват WPF за пределами модального окна

ответ

12

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

private void Window_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     if (posX < 0 || posX > this.Width || posY < 0 || posY > this.Height) 
      this.Close();    
    } 

    private void Window_MouseMove(object sender, MouseEventArgs e) 
    { 
     Point p = e.GetPosition(this); 

     posX = p.X; // private double posX is a class member 
     posY = p.Y; // private double posY is a class member 
    } 

    private void Window_Activated(object sender, EventArgs e) 
    { 
     System.Windows.Input.Mouse.Capture(this, System.Windows.Input.CaptureMode.SubTree); 
    } 

Это сделало работу для меня в сложном контексте: MFC, WindowsForms мамонт приложения - без вмешательства, никаких других сложных вещей. Надеюсь, что это помогает другим, сталкивающимся с этим странным поведением.

+2

Предостережение к этому подходу заключается в том, что окно закрывается, если пользователь нажимает на строку заголовка окна. Это также делает невозможным перепозиционирование окна. – Brandon

2

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

EventManager.RegisterClassHandler(typeof(Window), Mouse.MouseDownEvent, new MouseButtonEventHandler(OnMousepDown), true); 

или

EventManager.RegisterClassHandler(typeof(yourAppClassName), Mouse.PreviewMouseDownEvent, new MouseButtonEventHandler(OnMousepDown), true); 

//this is just a sample.. 
private void OnMousepDown(object sender, MouseButtonEventArgs e) 
    { 
     if (thatWindowThatYourTalkingAbout.IsOpen) 
      ..do something 
    } 
+0

Большое спасибо за подсказку. К сожалению, я не могу использовать этот подход, так как приложение является более старым MFC-интерфейсом, который прошел через некоторые этапы Windows Forms. Я попробовал взломы и современные подходы и я наконец, может найти решение. – teodron

+1

ничего себе, звучит как зверь! удачи, +1 к вашему сообщению ниже! –

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