3

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

4

2 回答 2

14

即使它是一个模态窗口(与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 庞大的应用程序 - 没有互操作,没有其他复杂的东西。希望它可以帮助其他人面对这种奇怪的行为。

于 2012-04-24T15:56:02.970 回答
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 
    }
于 2012-04-24T15:42:46.813 回答