WPF intercept clicks outside a modal window

后端 未结 2 613
日久生厌
日久生厌 2021-01-21 07:38

Is it possible to check when the user has clicked outside a modal window? I\'d like to somehow circumvent the modal logic because if the window isn\'t displayed as modal, it wil

相关标签:
2条回答
  • 2021-01-21 08:21

    Even if it's a modal window (displayed with ShowDialog() calls), one can add some even handlers to the window's class and make it check for the mouse clicks outside the window like this:

        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);
        }
    

    This did the job for me, in a difficult context: mingled MFC, WindowsForms mammoth of an app - no interop, no other complicated stuff. Hope it helps others facing this odd behavior.

    0 讨论(0)
  • 2021-01-21 08:42

    Well one way is to hook up the event handler on your main app and respond to it when you have that window open:

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

    or

      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 讨论(0)
提交回复
热议问题