2013-04-30 3 views
2

У меня есть приложение, которое сворачивается в системный трей, нажав кнопку «закрыть», и я хочу сохранить его состояние (положение, все элементы (comboboxes, textboxes) с их значениями и т. Д.). ,Сохраните состояние окна, когда приложение в лотке

Теперь я писал этот код, но он создает новое окно из лотка (вместо восстановления старого, с его параметрами):

# app.xaml.cs: 

this.ShutdownMode = ShutdownMode.OnExplicitShutdown; 

// create a system tray icon 
var ni = new System.Windows.Forms.NotifyIcon(); 
ni.Visible = true; 
ni.Icon = QuickTranslator.Properties.Resources.MainIcon; 

ni.DoubleClick += 
    delegate(object sender, EventArgs args) 
    { 
    var wnd = new MainWindow(); 
    wnd.Visibility = Visibility.Visible; 
    }; 

// set the context menu 
ni.ContextMenu = new System.Windows.Forms.ContextMenu(new[] 
{ 
    new System.Windows.Forms.MenuItem("About", delegate 
    { 
     var uri = new Uri("AboutWindow.xaml", UriKind.Relative); 
     var wnd = Application.LoadComponent(uri) as Window; 
     wnd.Visibility = Visibility.Visible; 
    }), 

    new System.Windows.Forms.MenuItem("Exit", delegate 
     { 
     ni.Visible = false; 
     this.Shutdown(); 
     }) 

}); 

Как я могу изменить этот код для моей проблемы?

+1

Не закрывайте и не заново создавайте окно, просто спрячьте его. –

+0

Хорошо, что я сделал, но как я могу получить доступ к экземпляру MainWindow из окна «App.xaml.cs» для восстановления? –

ответ

1

Когда вы держите ссылку на свой «MainWindow», вы можете просто вызвать Show() снова после его закрытия. Закрытие окна просто скроет его, и вызов Show снова восстановит его.

private Window m_MainWindow; 

ni.DoubleClick += 
    delegate(object sender, EventArgs args) 
    { 
    if(m_MainWindow == null) 
     m_MainWindow = new MainWindow(); 

    m_MainWindow.Show(); 
    }; 

Если you're уверены, что MainWidnow ваши применения первичного окна, то вы также можете использовать это:

ni.DoubleClick += 
    delegate(object sender, EventArgs args) 
    { 
    Application.MainWindow.Show(); 
    }; 

Я предпочел бы первый вариант, так как подмигнули явно.

+0

Хорошо, звучит неплохо, но как я могу сохранить экземпляр MainWindow '' m_MainWindow' var при первом запуске окна? –

+0

В какой-то момент вы создадите экземпляр окна, если не будете? Если вы явно не создали его, вы можете использовать свойство Application.MainWindow, которое автоматически устанавливается автоматически, см. Http://msdn.microsoft.com/en-us/library/system.windows.application.mainwindow.aspx – Mecaveli

+0

Yep , он работал (я использовал переменную 'this.MainWindow')! Спасибо, много! –