5

閉じたウィンドウを開くには、イベントを閉じるときにウィンドウを非表示にする必要があるサンプルをたくさん見てきましたが、作業の途中でウィンドウを閉じて、同じウィンドウを開いてコンテンツを表示すると、これは公平ではありません。以前にウィンドウを非表示にしたため、残しました。では、ウィンドウを閉じた後、またはウィンドウを非表示にした後に、ウィンドウを新たに開始するにはどうすればよいですか。

現在、非表示ウィンドウの show メソッドを呼び出した後に新しいウィンドウを表示する 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 さん、ありがとうございます。

4

3 に答える 3

11

非表示/表示の動作が必要な場合は、ウィンドウで Window.Close() を呼び出すのではなく、Window.Hide() を呼び出して非表示にします。ただし、ユーザーがそれを閉じており、閉じることが避けられない場合は、次のことを試すことができます。Window 内で 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 にすべてのデータを配置し、View にバインドする (つまり、ウィンドウの背後にあるコードにビジネス ロジックやデータがない) ことで、ViewModel でメソッドを呼び出して、ウィンドウが表示されたときにすべてのデータをリセットできます。バインディングが更新され、ウィンドウの状態がリセットされます。これは、MVVM に正しく従い、メイン フォームのすべての要素を ViewModel プロパティ (サブ コントロールを含む) にバインドした場合にのみ機能することに注意してください。

よろしくお願いします、

于 2012-01-05T11:30:18.570 に答える
1

それは本当にアプリの構造に依存します。状態を維持していないため、閉じられたウィンドウの実際のタイプのみを保存する必要があります。使用しているウィンドウのタイプに応じて、Tag後で認識できるように (プロパティなどで) ID を割り当てることができます。Closingその後、イベント中にこの ID を でプッシュできますStack。次に、ユーザーが再度開いた場合は、スタックをポップして ID を取得し、対応するウィンドウを確認します。その後、そのウィンドウを再度開くことができます。

もちろん、Stackは 1 つのデータ構造にすぎず、適切な場合とそうでない場合があります。スタックを使用すると、ユーザーは過去に閉じたすべてのウィンドウを再度開くことができますが、代わりに 1 つのウィンドウだけが必要になる場合があります。

編集 - 基本コード:

//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;
   }
}
于 2012-01-05T11:26:52.067 に答える