WPF拦截模态窗口外的点击

teo*_*ron 1 c# wpf c++-cli

是否可以检查用户何时在模态窗口外单击?我想以某种方式绕过模态逻辑,因为如果窗口没有显示为模态,它将不会显示在活动窗口的顶部,而且,目前,这是正确显示它的唯一方法.我还没有找到合适的方法(因为"停用"事件将不再被触发..)

teo*_*ron 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);
    }
Run Code Online (Sandbox Code Playgroud)

在困难的环境中,这对我来说很有帮助:混合使用MFC,应用程序的WindowsForms庞然大物 - 没有互操作,没有其他复杂的东西.希望它帮助其他人面对这种奇怪的行为.

  • 这种方法的一个警告是,如果用户点击窗口的标题栏,窗口将关闭.这也使得重新定位窗口变得不可能. (2认同)