Как заново открыть закрытое окно? - PullRequest
4 голосов
/ 05 января 2012

Я видел так много сэмплов, что для того, чтобы открыть закрытое окно, я должен скрыть окно при закрытии, но это не справедливо для меня, если я закрываю окно в середине моей работы и снова открываю то же самое окно, которое показывает мнесодержание, где я оставил, потому что я прячу окно ранее.Итак, как я могу начать заново мое окно после закрытия или скрыть окно.

В настоящее время я вызываю метод winload, который должен показать новое окно после вызова метода show окна скрытия.

    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.

Ответы [ 2 ]

9 голосов
/ 05 января 2012

Если вам нужно поведение hide / show, вам вообще не следует вызывать 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 ().Если вы скроете / покажите, как указано выше, то вы вернете окно в то же самое состояние, прежде чем оно было скрыто.

Используете ли вы шаблон MVVM в своем приложении WPF?Если это так, вы можете попробовать следующее.Имея все данные в вашей ViewModel и привязанные к представлению (то есть: нет бизнес-логики или данных в коде за окном), вы можете вызывать метод в ViewModel для сброса всех данных при отображении окна.Ваши привязки обновятся, и состояние окна будет сброшено.Обратите внимание, что это будет работать, только если вы правильно следовали MVVM и привязали все элементы в главной форме к свойствам ViewModel (включая элементы управления).

С уважением,

1 голос
/ 05 января 2012

Это действительно зависит от структуры вашего приложения.Поскольку вы не поддерживаете состояние, вам нужно только сохранить фактический тип окна, которое было закрыто.В зависимости от того, какой тип окна вы используете, вы можете назначить ему идентификатор (например, в свойстве Tag), чтобы его можно было распознать позже.Затем вы можете нажать этот идентификатор во время события Closing в Stack.Затем, если пользователь снова откроет его, вытолкните стек, чтобы получить идентификатор и проверьте, какое окно ему соответствует.Затем вы можете снова открыть это окно.

Конечно, 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;
   }
}
...