2012-01-05 64 views
4

我見過這麼多的樣本,爲了打開關閉的窗口,我應該在關閉事件中隱藏窗口,但這對我來說並不公平,如果我在工作中間關閉窗口並再次打開顯示內容的窗口我離開的地方,因爲我以前隱藏窗口。那麼在關閉或隱藏窗口後,我怎麼才能重新啓動我的窗口。如何重新打開關閉的窗口?

當前我打電話給winload方法,它是在調用隱藏窗口的顯示方法後顯示新窗口。

private PurgeData data=new PurgeData(); 

private void MenuPurgeData_Click(object sender, RoutedEventArgs e) 
     { 

      try 
      { 
       if (PurgeData == null) 
       { 
        PurgeData = new PurgeData(); 
        PurgeData.Show(); 
       } 
       else 
       { 
        PurgeData.WinLoad(); 
        PurgeData.Show();      
       } 
      } 

謝謝, @nagaraju。

回答

1

這真的取決於你的應用程序的結構。由於您沒有維護狀態,因此只需要保存已關閉的實際窗口類型即可。根據您使用的窗口類型,您可以爲其分配一個ID(例如,在其Tag屬性中),以便稍後可以識別它。然後您可以在Closing事件期間推送此ID。然後,如果用戶重新打開它,請彈出堆棧以獲取ID並檢查對應的窗口。然後您可以重新打開該窗口。

當然,Stack只是一種數據結構,它可能適用於您,也可能不適合您。使用堆棧意味着用戶可以重新打開他們關閉的所有過去的窗口,但也許您可能只想要一個窗口。

編輯 - 基本代碼:

//create an enum to make it easy to recognise the type of window that was open 
enum WindowType { Profile, Settings }; 

//create a stack to hold the list of past windows 
Stack<WindowType> pastWindows = new Stack<WindowType>(); 

//give the window type a particular id 
profileWindow.Tag = WindowType.Profile; 

//open the window 
profileWindow.Show(); 

//in the closing event, if you want the user to be able to reopen this window, push it to the stack 
protected override void OnClosing(CancelEventArgs e) 
{ 
     pastWindows.Push(WindowType.Profile); //or whatever type it was 
     base.OnClosing(e);  
} 

//to reopen the last window 
void ReopenLastWindow() 
{ 
    WindowType lastType = pastWindows.Pop(); 
    switch(lastType) 
    { 
     case WindowType.Profile: 
      profileWindow.Show(); 
      break; 
     case WindowType.Settings: 
      settingsWindow.Show(); 
      break; 
     default: 
      break; 
    } 
} 
+0

如果你不是我的,你能否提供示例代碼片段。 – nag 2012-01-05 12:20:31

+0

我已添加代碼。它完全沒有經過測試,並直接輸入到StackOverflow中,所以在某些屬性/方法上可能存在編譯器錯誤,但它應該給你一個總體思路。 – keyboardP 2012-01-05 12:30:50

+0

非常感謝。 – nag 2012-01-05 12:33:49

8

如果你想要隱藏/顯示的行爲,你應該不會在窗口上調用window.close()的所有,但通過調用Window.Hide隱藏它( )。如果用戶已經關閉但不可避免地關閉,則可以嘗試以下操作。在窗口內覆蓋OnClosing並將e.Cancelled設置爲true,然後調用.Hide()。這應該允許窗口隱藏/顯示,即使用戶關閉窗口。

// Disclaimer, untested! 
protected override void OnClosing(CancelEventArgs e)  
{   
    e.Cancel = true; // cancels the window close  
    this.Hide();  // Programmatically hides the window 
} 

編輯:

好吧,現在我讀過你的問題正確;-) 因此,如何能我剛開始我的窗口關閉後或隱藏窗口。

當您使用上述重新顯示窗口時,它當然會與以前隱藏的實例相同,因此將具有相同的數據和狀態。如果你想要全新的內容,你需要創建一個新的Window()並調用Window.Show()。如果您像上面一樣隱藏/顯示,那麼您將在隱藏之前將窗口恢復到完全相同的狀態。

您是否在WPF應用程序中使用了MVVM模式?如果是這樣,你可以嘗試以下。通過將視圖模型中的所有數據綁定到視圖(即:窗口後面的代碼中沒有業務邏輯或數據),您可以調用ViewModel上的方法在顯示窗口時重置所有數據。您的綁定將刷新並且窗口狀態將被重置。請注意,只有在您正確遵循MVVM並將主窗體上的所有元素綁定到ViewModel屬性(包括子控件)後,這纔會起作用。

最好的問候,

+0

目前我打電話時調用Load方法打開隱藏窗口時調用window_load方法,然後它顯示給我像新窗口。 – nag 2012-01-05 12:23:20

+0

@nag,這聽起來不像是正確的做事方式。你不應該專門調用Window_Load。你應該從外部代碼調用的唯一方法是new()(創建一個新實例),Close()(關閉並且不再重新打開),Show()(在新的或之前的Hide()隱藏()隱藏顯示的窗口。最好的問候, – 2012-01-05 12:25:25

+0

是啊!爲了顯示新窗口,我調用一個顯示窗口爲新鮮的方法,這是在調用隱藏窗口的.show()方法之前調用的。這種方法是對還是錯告訴我? – nag 2012-01-05 12:31:41