如何关闭 WPF 中隐藏的主窗口?

Posted

技术标签:

【中文标题】如何关闭 WPF 中隐藏的主窗口?【英文标题】:How to close a hidden main window in WPF? 【发布时间】:2020-11-21 04:28:13 【问题描述】:

我在一个应用程序中有两个窗口。

第一个窗口有一个按钮。当我单击该按钮时,将打开第二个窗口。 (第一个窗口需要关闭或隐藏)。然后我需要关闭我的第二个窗口并需要停止调试。怎么做?

<Window x:Class="WpfApp5.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:WpfApp5"
    xmlns:syncfusion="http://schemas.syncfusion.com/wpf"
    xmlns:Control="clr-namespace:Syncfusion.Windows.Tools.Controls;assembly=Syncfusion.Tools.Wpf"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Grid>
    <Button Content="Create" Height="50" Width="100" Click="btncreate"></Button>
</Grid>

MainWindow 代码隐藏:

public partial class MainWindow : Window

    public static TextBox textBox;

    public MainWindow()
    
        InitializeComponent();
    

    private void btncreate(object sender, RoutedEventArgs e)
    
        SecondWindow secondWindow = new SecondWindow();
        secondWindow.Owner = this;
        this.Hide();
        secondWindow.ShowDialog();
    

第二个窗口:

<Window x:Class="WpfApp5.SecondWindow"
    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:WpfApp5"
    mc:Ignorable="d"
    Title="SecondWindow" Height="450" Width="800">
<Grid>
    <StackPanel>
        <TextBlock Text="New Project Loaded" HorizontalAlignment="Center" Margin="50"></TextBlock>
    </StackPanel>
</Grid>

【问题讨论】:

你真的是在调试吗? 自动停止调试(不能手动) Application.Current.Shutdown();应该关闭应用程序。如果这很重要,您需要检查应用程序是否处于调试模式。 我使用 Application.Current.Shutdown()。但是这个错误来了 System.InvalidOperationException: 'Cannot set Visibility to Visible or call Show, ShowDialog, Close, or WindowInteropHelper.EnsureHandle while a Window is close.' 这个错误也来了 无法从程序集 'mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089' 加载类型 'System.Runtime.Remoting.Messaging.IRemotingFormatter'。跨度> 【参考方案1】:

您的问题似乎是您正在运行显示窗口的代码,可能是模态的。 同时,您正在尝试关闭应用程序。

您尚未显示此代码,但如果您的 btnCreate 处理程序在之前已关闭

secondWindow.ShowDialog();

在将该窗口显示为对话框的同时,您会尝试有效地关闭应用程序。

您想要的是关闭应用程序的代码,而不是在 UI 忙于执行其他操作(例如显示窗口)时。

你可以通过移动你的关闭来做到这一点,所以它就是你正在显示的那个窗口的 contentrendered 事件处理程序。

另一种选择是使用调度程序安排关机。

Application.Current.Dispatcher.InvokeAsync(new Action(() => 
  
    Application.Current.Shutdown();
), DispatcherPriority.ContextIdle);

如果您仍然有错误,您可以考虑改用。

      Environment.Exit(0);

与关闭相比,这是一种相当暴力的方法,但如果您只是在调试时这样做,那可能并不重要。

在任何情况下,您都应该确保您没有显示另一个窗口或任何窗口的 window.closure 事件中的某些内容的代码。由于关闭应用程序必然会涉及关闭窗口。

【讨论】:

以上是关于如何关闭 WPF 中隐藏的主窗口?的主要内容,如果未能解决你的问题,请参考以下文章

禁用 WPF 窗口标题栏中的关闭按钮 (C#)

从 WPF 窗口隐藏图标

新手求教WPF中如何设置打开子窗体后父窗体关闭或隐藏.

wpf 如何让当前窗口隐藏

wpf 如何让当前窗口隐藏

如何使WPF弹出式窗口不被隐藏在主应用程序