当用户在 wpf 应用程序中单击主窗口时如何关闭窗口

本文关键字:窗口 何关闭 单击 用户 wpf 应用程序 | 更新日期: 2023-09-27 18:31:59

>我有一个WPF应用程序,它将一个窗口显示为对话框。我想在应用程序中单击主窗口上的任意位置时关闭此对话框。

在这里,我添加一个示例来解释

应用程序主窗口

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="Open new Window" Click="Button_Click" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>
</Window>

主窗口背后的代码

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Window1 temp_Window = new Window1();
            temp_Window.ShowDialog();
        }
    }
}

我尝试关闭的儿童窗口

<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="Window1" Height="300" Width="300" Deactivated="Window_Deactivated">
    <Grid>
        <TextBlock>New Window</TextBlock>
    </Grid>
</Window>

此子窗口背后的代码

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
        private void Window_Deactivated(object sender, EventArgs e)
        {
            Close();
        }
    }
}

谢谢

当用户在 wpf 应用程序中单击主窗口时如何关闭窗口

您可以使用

对话框窗口的"已停用"事件执行此操作

像这样的东西

XAML

<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="Window1" Height="200" Width="200" WindowStartupLocation="CenterScreen" 
        Deactivated="Window_Deactivated">
    <Grid>
    </Grid>
</Window>

法典

private void Window_Deactivated(object sender, EventArgs e)
{
    this.Close();
}

如果使用 ShowDialog 调用对话框,背景窗口(即 MainWindow)将被禁用,直到您关闭对话框并且它不会得到任何点击,因此除非您使用 Show 方法调用不会锁定背景窗口的 DialogBox,否则您无法实现所需的内容,然后您可以在 MainWindow GotFocus 触发时关闭对话框。

首先将您的temp_window声明为归档而不是局部变量:

private Window1 temp_Window;

当您打开新窗口时,不要将其作为对话框打开,否则,将不会使用 Show() 而不是ShowDialog()来处理 mainWindow 上的事件:

private void Button_Click(object sender, RoutedEventArgs e)
        {
            temp_Window = new Window1();
            temp_Window.Show();
        }

在主窗口处理mouseDown事件:

MouseDown="MainWindow_OnMouseDown"

并关闭处理程序中的tempWindow

 private void MainWindow_OnMouseDown(object sender, MouseButtonEventArgs e)
    {
        tempWindow .Close();
    }

您必须将第二个窗口声明为全局变量并调用 .隐藏() 和 .Show() 命令是这样的:

主窗口:

public partial class MainWindow : Form
{
    private Dialog m_Dialog;
    public MainWindow()
    {
        InitializeComponent();
        m_Dialog = new Dialog();
        this.Click += closeDialog;
    }
    private void closeDialog(object sender, EventArgs e)
    {
        m_Dialog.Hide();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        m_Dialog.Show();
    }
}

它工作得很好。

已更新

下面是 WPF 的相同代码。我以前在WinForms中做过:

public partial class MainWindow : Window
{
    private Dialog m_Dialog;
    public MainWindow()
    {
        InitializeComponent();
        m_Dialog = new Dialog();
        this.MouseDoubleClick += onCloseDialog;
    }
    private void onCloseDialog(object sender, MouseButtonEventArgs e)
    {
        m_Dialog.Hide();
    }
    private void onButton(object sender, RoutedEventArgs e)
    {
        m_Dialog.Show();
    }
}

当然,您可以使用其他事件而不是MouseDoubleClick。如果确实要关闭窗口,则必须使用 .关闭() 命令并每次调用窗口的构造函数。