在WPF中切换两个窗口

4
假设我有一个WPF应用程序中的两个不同窗口Window1和Window2。
基于Window1中的某些操作,Window2会弹出一段时间,还基于Window1中的某些操作,Window2应该关闭并且视图返回到Window1以及它在Window2出现之前的状态。
所说的状态是指Window1中所有控件中存在的所有内容。
为了实现切换,我使用了ShowDialog(),这正是我需要的,因为我需要Window1在Window2出现时冻结。
现在我的问题是我无法返回带有其内容的Window1。
MainWindow(Window1).xaml
<Window x:Class="Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Button Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="193,130,0,0" Click="Button_Click"/>
</Grid></Window>
private void Button_Click(object sender, RoutedEventArgs e)
{
    Window1 window1 = new Window1();
    window1.ShowDialog();

    //Actions

    window1.Close();
}

Window1的xaml文件是正常的,除了我将

WindowStyle=None

进行了修改,所以我无法使用右上角的退出按钮来关闭它。


根据您所说的某些操作,只需关闭Window2窗口即可。 - Alexander Bell
@AlexBell 谢谢您的回复,我们不是第一次见面 :) .. 我该如何实现这个 Close() 没有任何作用的问题。 - Xexolas
窗口的右上角控制框应该有一个“关闭”按钮;此外,您还可以从与Windows2中某些控件关联的事件处理程序中调用window.Close()方法。为了获得更详细的答案,请包括与问题相关的整个代码片段。最好的问候, - Alexander Bell
@AlexBell 谢谢你再次回复,看一下我的编辑。 - Xexolas
那么,Window1和Window2是什么?你的代码片段看起来完全错误。请澄清一下。 - Alexander Bell
显示剩余2条评论
4个回答

3

这个话题有点过时了,但也许这就是你谈论的内容?

// Currently in Window1, want to open window2 and make window1 not visible
private void Change_Click(object sender, RoutedEventArgs e)
        {
            Window2 mainWindow = new Window2();
            Visibility = Visibility.Hidden;
            Window2.Show();
        }

2
如果您正在使用MVVM,您可以使用以下内容:
public static class DialogCloser
{
    public static readonly DependencyProperty DialogResultProperty =
        DependencyProperty.RegisterAttached(
            "DialogResult",
            typeof(bool?),
            typeof(DialogCloser),
            new PropertyMetadata(DialogResultChanged));

    private static void DialogResultChanged(
        DependencyObject d,
        DependencyPropertyChangedEventArgs e)
    {
        var window = d as Window;
        if (window != null)
            window.DialogResult = e.NewValue as bool?;
    }
    public static void SetDialogResult(Window target, bool? value)
    {
        target.SetValue(DialogResultProperty, value);
    }
}

在XAML中:

 <Window x:Class="Window2"
    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/
    xmlns:xc="clr-namespace:Window2"
    xc:DialogCloser.DialogResult="{Binding DialogResult}"

然后在模型中,您可以使用以下内容:
 public bool? DialogResult
    {
        get;
        set;
    }

我最终发现使用 MVVM 是许多问题的解决方案,谢谢你的帮助。 - Xexolas

2

您的问题和业务逻辑有些不清晰,因此答案是基于合格的猜测:为了以对话框模式打开第二个WPF窗口(window2),请使用以下通用代码:

Window2 _window2 = new Window2()
{
    Title = "Modal Dialog Window",
    Topmost = true,
    ResizeMode = ResizeMode.NoResize,
    ShowInTaskbar = false,
    Owner = this
};
_window2.ShowDialog();

为了关闭第二个window2,可以使用右上控制框中的标准“关闭”按钮,或将Button添加到该window2并将this.Close()语句放入该按钮Click事件。
根据您的额外评论进行编辑:如果您将第二个窗口显示为模态对话框,则会阻止所有者窗口(例如弹出MessageBox)。请澄清业务逻辑,因为不太清楚为什么需要从主窗口打开第二个窗口,然后关闭它。在主窗口的按钮单击事件中,在打开和关闭第二个窗口之间执行了哪些“操作”?您可以考虑以正常模式打开第二个窗口,然后可以使用放置在第一个窗口上的某些按钮控件从主窗口关闭它。看起来您需要优化业务逻辑。
希望这可以帮助到您。

我已经扩展了答案并进行了详细的解释:似乎你需要先完善你的业务逻辑,然后按照我的答案描述实现代码库。此时我将关闭这个讨论。祝你的项目好运。最好的问候。 - Alexander Bell

1
这是对我常见的解决方案:

Dim TheAboutWindow As New winAbout
TheAboutWindow.Owner = Me
TheAboutWindow.ShowDialog()
TheAboutWindow = Nothing

有时候我会使用My.Windows.winName,这样我就不需要一遍又一遍地加载东西,但你需要取消关闭并以某种方式隐藏窗口。
但是My.Windows.winName有一个很好的特点,你不需要记住变量名,通常对于任何打开的窗口都可以访问。(不确定两个实例同时打开时如何处理。)
这意味着你可以这样做:My.Windows.winMain.Title = "OMG Jawj. Did you see that?"
My.Windows.winHost.Owner = Me
My.Windows.winHost.ShowDialog()

如果您想从子元素执行最小化功能并在最大/正常时再次显示子元素,则可以/应省略所有者行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接