在WPF中切换两个窗口

时间:2016-03-26 18:21:47

标签: c# wpf

假设我在WPF应用程序Window1和Window2中有两个不同的窗口。

基于Window1的一些操作,Window2弹出一段时间,并且还基于Window1中的一些操作,Window2应该关闭并在Window2出现之前查看返回Window1的状态。

使用它的状态我的意思是Window1中存在的所有控件中的所有内容。

实现我使用的切换

  

的ShowDialog();

我正好看,因为我需要在Window2打开时冻结Window1。

现在我的问题是我无法使用它的内容返回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>
  

Button_Click

private void Button_Click(object sender, RoutedEventArgs e)
{
    Window1 window1 = new Window1();
    window1.ShowDialog();

    //Actions

    window1.Close();
}

和Window1 xaml是一个正常的我没有改变任何东西,除了我做了

  

WindowStyle =无

因此我无法使用右上方退出按钮退出

4 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:2)

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

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

要关闭第二个window2,请使用标准&#34;关闭&#34;右上方控制框中的按钮,或将Button添加到window2并将this.Close()语句添加到该按钮Click事件中。

根据您的其他评论进行编辑:如果您将第二个窗口显示为模态对话框,那么您将阻止所有者窗口(例如弹出MessageBox)。请澄清您的业务逻辑,因为您不清楚为什么需要打开第二个窗口然后从主窗口关闭它。什么样的&#34;行动&#34;你在主窗口的按钮点击事件中打开和关闭第二个窗口之间?您可以考虑在正常模式下打开第二个窗口,然后可以使用例如第一个窗口上放置的某个Button控件从主窗口关闭它。看来你必须改进业务逻辑。

希望这可能会有所帮助。

答案 2 :(得分:1)

这是我常用的东西:

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

当我不想一遍又一遍地加载东西时,我有时会使用My.Windows.winName,但你需要取消关闭并以某种方式隐藏窗口。

但My.Windows.winName有一个很棒的事情,你不需要记住变量名,它通常可以在任何打开的窗口中访问。 (不确定当两个实例打开时如何工作。)

这意味着你可以做My.Windows.winMain.Title =&#34; OMG Jawj。你看到了吗?&#34;

My.Windows.winHost.Owner = Me
My.Windows.winHost.ShowDialog()

如果您想要从孩子那里执行最小化功能并在max / normal上再次显示孩子,您可以/应该省略所有者行。

答案 3 :(得分:1)

这个话题太老了,但是也许这就是你在说什么?

// 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();
        }
相关问题