繁体   English   中英

用户单击WPF应用程序中的主窗口时如何关闭窗口

[英]How to close a window when user clicks on mainwindow in wpf application

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

我在这里添加一个示例示例来说明

应用程序的主窗口

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

谢谢

您可以使用DialogBox窗口的Deactivated事件来执行此操作

像这样的东西

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调用DialogBox,则背景窗口(即MainWindow)将被禁用,直到您关闭DialogBox,并且它不会获得任何点击,因此除非调用DialogBox,否则您将无法实现所需的功能使用不会锁定背景窗口的Show方法,然后可以在MainWindow GotFocus触发时关闭DialogBox。

您必须将第二个窗口声明为全局变量,然后调用.Hide()和.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。 如果您确实要关闭窗口,则必须使用.Close()命令,并每次都调用窗口的构造函数。

首先将您的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();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM