我有一个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;
主窗口后面的代码
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;
我尝试关闭的子窗口
<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;
此子窗口背后的代码
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;
由于
答案 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();
}