【问题标题】:Switching between two windows in WPF在 WPF 中的两个窗口之间切换
【发布时间】:2016-03-26 18:21:46
【问题描述】:

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

基于 Window1 的一些动作,Window2 会弹出一段时间,并且基于 Window1 中的一些动作,Window2 应该关闭并且视图返回到 Window1 并保持 Window2 出现之前的状态。

对于它的状态,我的意思是 Window1 中存在的所有控件中的所有内容。

实现我使用的切换

显示对话框();

我正在寻找正是因为我需要在 Window2 开启时冻结 Window1。

现在我的问题是无法返回 Window1 的内容。

主窗口 (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 是一个普通的 xaml 我没有改变任何东西,只是我做了

WindowStyle=None

所以我不能用右上角的退出按钮退出它

【问题讨论】:

  • 按照您所说的“基于某些操作”关闭 Window2。
  • @AlexBell 感谢您的回复,我们不是第一次见面 :) .. 我怎样才能做到这一点,Close() 没有任何作用
  • Window的右上角控制框中应该有一个“关闭”按钮;你也可以调用 window.Close();来自与该 Windows2 中的某些控件关联的事件处理程序的方法。为了获得更详细的答案,请包含与问题相关的整个代码 sn-p。最好的问候,
  • @AlexBell 再次感谢您的回复,请查看我的编辑
  • 那么,Window1 和 Window2 是什么?您的代码 sn-ps 似乎完全错误。请澄清。

标签: c# wpf


【解决方案1】:

如果你使用的是 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 可以解决很多问题,感谢您的帮助..
【解决方案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() 语句放入该按钮 @ 987654326@事件。

根据您的附加 cmets 进行编辑:如果您将第二个窗口显示为模态对话框,那么您将阻止所有者窗口(例如弹出消息框)。请澄清您的业务逻辑,因为非常不清楚为什么需要打开第二个窗口然后从主窗口关闭它。您在主窗口的按钮单击事件中打开和关闭第二个窗口之间放置了什么样的“操作”?您可以考虑在正常模式下打开第二个窗口,然后您可以使用例如放置在第一个窗口上的一些 Button 控件从主窗口关闭它。看来您必须改进业务逻辑。

希望这会有所帮助。

【讨论】:

  • 我已经用详细的解释扩展了答案:看来您必须先完善您的业务逻辑,然后按照我的答案中的描述实现代码库。在这一点上,我将结束这个讨论。祝你的项目好运。最好的问候,
【解决方案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();
        }

【讨论】:

    【解决方案4】:

    以下是我常用的方法:

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

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

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

    这意味着您可以执行 My.Windows.winMain.Title = "OMG Jawj。您看到了吗?"

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-13
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多