簡體   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