2015-06-16 44 views
2

我新的WPF,找不到的答案,这个问题:返回前一个窗口在WPF

我有3个窗口,我想between- 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? 
    } 

回答

0

改变你展示你的窗户是这样的:

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

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

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

这段代码几乎可以工作 - 它会在取消点击Window2时显示Window1和MainWindow。我想在没有显示MainWindow的情况下返回Window1。 – Maya

+0

是的,我刚才[问](问)(http://stackoverflow.com/questions/30863139/showdialog-ends-prematurely-if-called-from-hidden-windows/30863739)有关该行为,并相应地编辑我的答案。 – Yegor

+0

谢谢!这样可行。重要的是要注意,在MainWindow Show()中应该使用ShowDialog而不是ShowDialog()。 – Maya

2

下面是一个例子导航服务类的一个导航窗口堆栈。

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之类的工具。