2015-06-16 63 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之類的工具。