如何在关闭窗口时使MainWindow进入视图

本文关键字:MainWindow 视图 窗口 | 更新日期: 2023-09-27 18:07:28

当我关闭同一应用程序中的特定窗口时,我正试图将我的MainWindow显示在视图中。我试过这样做,但用我创建的代码,它只创建了一个新的MainWindow实例,我最终拥有了2个MainWindows,而不是一个想要的。这是我得到的下面的代码。

 private void Weight_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            MultipleConverters.Windows.Weight WeightCalculation = new Windows.Weight();
            WeightCalculation.Show();
            this.WindowState = WindowState.Minimized;
        }

//上面的代码工作得很好,可以最小化主窗口,并将所选窗口显示在视图中。

private void Quit_Click(object sender, RoutedEventArgs e)
    {
        this.Close();
        MainWindow bringIntoView = new MainWindow();
        bringIntoView.Show();
    }

//现在,上面的代码就是问题代码。这段代码在新窗口中,我试图实现的是,当这个窗口关闭时,主窗口将被带回范围,而不是创建它的新实例,给我留下2个主窗口,而不是所需的1个主窗口。任何帮助都会很棒。

如何在关闭窗口时使MainWindow进入视图

使用Owner属性来存储对主窗口的引用,然后可以使用该属性来恢复窗口。

private void Weight_Click(object sender, RoutedEventArgs e)
{
    try
    {
        MultipleConverters.Windows.Weight WeightCalculation = new Windows.Weight();
        WeightCalculation.Owner = this;
        WeightCalculation.Show();
        this.WindowState = WindowState.Minimized;
    }

其他

private void Quit_Click(object sender, RoutedEventArgs e)
{
    this.Close();
    Owner.WindowState = WindowState.Normal;
}

但是,根据您显示的行为,您可能希望使用ShowDialog(),而不是最小化父窗口,并使用它。

private void Weight_Click(object sender, RoutedEventArgs e)
{
    try
    {
        MultipleConverters.Windows.Weight WeightCalculation = new Windows.Weight();
        WeightCalculation.Owner = this;
        WeightCalculation.ShowDialog(); //The code pauses here till the dialog is closed.
    }
Application.Current.MainWindow.Activate();

有一个方便的属性Application.Current.MainWindow可以用来访问App.xaml中声明的主窗口,您应该可以通过调用来显示它

Application.Current.MainWindow.Show();
Application.Current.MainWindow.Activate();

为了简化事情,您可以在MainWindow上创建一个静态方法来处理所有这些:

public static void TryReveal()
{
    var mainWindow = Application.Current.MainWindow;
    if (mainWindow == null)
    {
        // The main window has probably been closed.
        // This will stop .Show() and .Activate()
        // from throwing an exception if the window is closed.
        return;
    }
    if (mainWindow.WindowState == WindowState.Minimized)
    {
        mainWindow.WindowState = WindowState.Normal;
    }
    // Reveals if hidden
    mainWindow.Show();
    // Brings to foreground
    mainWindow.Activate();
}

然后您的其他窗口可以直接调用MainWindow.TryReveal()。这样,你的窗口就不需要任何对主窗口的引用,因为静态方法处理它


不过,在WPF中处理此问题的最佳方法是(我认为(使用消息传递实现(例如MVVM Light的消息传递系统或Caliburn.Micro的EventAggregator(。您的MainWindow将订阅"MainWindowViewStateMessage"或类似的东西(由您定义(,而您的其他窗口将通过消息系统传递它。主窗口将拦截它并进行必要的工作。

private void Quit_Click(object sender, RoutedEventArgs e)
    {
        this.Close();
        MainWindow bringIntoView = new MainWindow();
        bringIntoView.Show();
    }

您正在创建一个MainWindow的新实例,然后显示它。这就是显示新MainForm的原因。

你可以做的一件事是在WeightCalculation窗口上设置一个属性,如下所示:

public MainWindow _mainWindow { get; set; }

在显示权重计算之前,请将_mainWindow设置为当前的mainWindow:实例

MultipleConverters.Windows.Weight WeightCalculation = new Windows.Weight();
WeightCalculation._mainWindow = this;
WeightCalculation.Show();
this.WindowState = WindowState.Minimized;

从新表单中,您现在可以与主窗口进行交互。