当用户单击以ShowDialog启动的窗口外时显示消息

时间:2018-07-18 00:30:00

标签: c# wpf xaml

我有Sample Wpf应用程序,我在其中从全屏启动的主窗口中启动一个窗口。每当用户在启动的子窗口之外单击时,我都想显示一个消息框。我实际上是指这篇帖子how to close a WPF Dialog Window when the user clicks outside it

但是问题是在这种情况下,“停用”仅在这种情况下关闭子窗口时才会引发。请帮助我如何实现这一目标。 编辑:注意,我想显示对话框,因为我希望子窗口成为阻止窗口。

private void Button_Click(object sender, RoutedEventArgs e)
        {
            Window w = new Window();
            w.Height = 990;
            w.Width = 1840;
            w.MaxHeight = 990;
            w.Width = 1840;
            w.WindowStartupLocation = WindowStartupLocation.Manual;
            w.Top = this.Height - w.Height;
            w.Left = this.Width - w.Width;
            w.Deactivated += W_Deactivated;
            w.ShowDialog();
        }

        private void W_Deactivated(object sender, EventArgs e)
        {
            MessageBox.Show("You clicked out");
        }

2 个答案:

答案 0 :(得分:1)

这里,我正在使用System.Windows.Input InputManager PreProcessInput事件来预览在定义的元素({{1 }})。

然后,用Window计算鼠标左键的位置。
如果单击是在元素element.RestoreBounds.Contains(element.PointToScreen(e.GetPosition(element)))外部生成的,则窗口会显示一条消息,然后关闭(或退出应用程序)。

使用e.StagingItem.Input激活鼠标捕获,并使用UIElement.CaptureMouse()Bounds事件上释放鼠标。
它与使用UIElement.ReleaseMouseCapture大致相同。

请注意,您可以单击Window控件,但是如果使用其MouseDown拖动Window,则不会引发TitleBar事件(默认情况下,它会被吃掉)。
如果这是一个问题,请创建一个逻辑来检测鼠标事件是否在该区域中生成,并在MouseUp完成后恢复捕获。

MouseDown

答案 1 :(得分:0)

使用

w.Show();

由于较早的是模态对话框(Showdialog()),因此除非将其关闭,否则无法继续操作。