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

时间:2016-01-27 06:01:33

标签: c# wpf

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

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

MainWindow of application



<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>
&#13;
&#13;
&#13;

主窗口后面的代码

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

我尝试关闭的子窗口

&#13;
&#13;
<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>
&#13;
&#13;
&#13;

此子窗口背后的代码

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

由于

4 个答案:

答案 0 :(得分:0)

您可以使用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();
}

答案 1 :(得分:0)

如果你用ShowDialog调用DialogBox,那么后台窗口(也就是MainWindow)将被禁用,直到你关闭DialogBox并且它不会获得任何点击,所以你无法达到你想要的效果除非你用Show方法调用DialogBox而不能锁定背景窗口,否则你可以在MainWindow GotFocus触发时关闭DialogBox。

答案 2 :(得分:0)

您必须将第二个窗口声明为全局变量,并调用.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()命令并每次调用你窗口的构造函数。

答案 3 :(得分:0)

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