【问题标题】:return to previous window on WPF返回上一个 WPF 窗口
【发布时间】:2015-06-16 06:30:25
【问题描述】:

我是 WPF 新手,无法找到此问题的答案:

我要在 3 个窗口之间导航 - MainWindow -> Window1 -> Window2

cancel按钮上点击Window2我想回到Window1。

我发现这段代码可以在 2 个窗口之间导航,但不是在 3 个窗口之间导航:

主窗口:

    private void Window1_Click(object sender, RoutedEventArgs e)
    {
        Window1 window1 = new Window1();
        window1.Show();
        this.Hide();
    }

窗口1:

    private void btn_Cancel_Click(object sender, RoutedEventArgs e)
    {
        Application.Current.MainWindow.Show();
        this.Close();
    }

    private void btn_Window2_Click(object sender, RoutedEventArgs e)
    {
        Window2 window2 = new Window2();
        window2 .Show();
        this.Hide();
    }

窗口2:

    private void btn_Cancel_Click(object sender, RoutedEventArgs e)
    {
        this.Close();
        //what should I write to show Window1 again?
    }

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    下面是一个导航服务类的示例,它包含一堆导航窗口。

    public static class NavigationService
    {
        static NavigationService()
        {
            NavigationStack.Push(Application.Current.MainWindow);
        } 
    
        private static readonly Stack<Window> NavigationStack = new Stack<Window>();
    
        public static void NavigateTo(Window win)
        {
            if(NavigationStack.Count > 0)
                NavigationStack.Peek().Hide();
    
            NavigationStack.Push(win);
            win.Show();
        }
    
        public static bool NavigateBack()
        {
            if (NavigationStack.Count <= 1)
                return false;
    
            NavigationStack.Pop().Hide();
            NavigationStack.Peek().Show();
            return true;
        }
    
        public static bool CanNavigateBack()
        {
            return NavigationStack.Count > 1;
        }
    }
    

    您可以从您的视图代码中使用它:

        public void OnNextClicked(object sender, EventArgs args)
        {
            NavigationService.NavigateTo(new Window2());
        }
    
        public void OnPreviousClicked(object sender, EventArgs args)
        {
            NavigationService.NavigateBack();
        }
    

    静态构造函数将从 App.xaml StartupUri 启动的主视图添加到导航堆栈作为初始视图。

    如果您的应用程序越来越复杂,您还可以查看prism navigation system 等工具。

    【讨论】:

      【解决方案2】:

      像这样更改显示窗口的方式:

      private void Window1_Click(object sender, RoutedEventArgs e)
      {
          Hide();
          new Window1().ShowDialog();
          ShowDialog();
      }
      

      并使用DialogResult 属性隐藏您的窗口(主窗口除外):

      private void btn_Cancel_Click(object sender, RoutedEventArgs e)
      {
          DialogResult = false;
      }
      

      【讨论】:

      • 这段代码几乎可以工作 - 它导致在取消单击 Window2 时显示 Window1 和 MainWindow。我想在不显示 MainWindow 的情况下返回 Window1。
      • 是的,我刚刚asked 了解了这种行为,并在此处相应地编辑了我的答案。
      • 谢谢!这样可行。重要的是要注意在 MainWindow 中应该使用 Show() 而不是 ShowDialog()。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 2023-02-17
      • 1970-01-01
      • 2018-10-12
      • 2017-11-24
      相关资源
      最近更新 更多