2012-01-05 5 views
4

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

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

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

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

Конечно, Stack - это всего лишь одна структура данных, и она может быть или не подходит для вас. Использование стека означает, что пользователь может повторно открыть все последние окна, которые они закрыли, но, возможно, вам может просто понадобиться только одно окно.

Edit - базовый код:

//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

+0

Я добавил код.Он полностью непроверен и был введен непосредственно в StackOverflow, поэтому могут быть ошибки компилятора для некоторых свойств/методов, но он должен дать вам общую идею. – keyboardP

+0

большое вам спасибо. – nag

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 
} 

EDIT:

Ok Я теперь прочитал ваш вопрос правильно ;-) Так как я могу начать свеж моего окна после закрытия или скрыть окно.

При повторном показе окна, используя вышеизложенное, это, конечно, будет тот же экземпляр, который был ранее скрыт, следовательно, будет иметь те же данные и состояние. Если вы хотите полностью новое содержимое, вам нужно создать новое окно() и вызвать Window.Show(). Если вы скрываете/показываете, как указано выше, вы получите окно обратно в точно таком же состоянии, пока оно не будет скрыто.

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

С уважением,

+0

В настоящее время я вызываю метод Load, когда во время открытия окна hide, которое вызывается методом window_load, оно показывает мне как новое окно. – nag

+0

@nag, это не похоже на правильный способ делать что-то. Вы не должны специально вызывать Window_Load. единственными методами, которые вы должны вызывать из внешнего кода, являются new() (для создания нового экземпляра), Close() (чтобы закрыть и никогда не открывать), Show() (для отображения после нового или предыдущего Hide()) и Скрыть(), чтобы скрыть отображаемое окно. С уважением, –

+0

да! чтобы показать новое окно, я вызываю метод, который отображает окно как новое, это вызывает перед вызовом метода .show() окна скрыть. Является ли этот подход правильным или неправильным, скажите мне? – nag

Смежные вопросы