tags:

views:

1760

answers:

3

How do i do this in wpf

VB.NET

   Private Sub FrmSettings_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        e.Cancel = (e.CloseReason = Forms.CloseReason.UserClosing)
        Me.Hide()
    End Sub

c#

private void FrmSettings_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e)
{
    e.Cancel = (e.CloseReason == Forms.CloseReason.UserClosing);
    this.Hide();
}

as wpf's Close event just gives me e.Cancel and no closereason :(

+2  A: 

There is not an equivalent in the default implementation of WPF. You can use a windows hook to get the reason though.

The following post details how to do this: http://social.msdn.microsoft.com/forums/en-US/wpf/thread/549a4bbb-e77b-4c5a-b724-07996774c60a/

JaredPar
How ugly that there is nothing built in :(
Petoj
+3  A: 

I'm not sure I understand what the WinForms approach solves.

Isn't it better to always do this:

Protected Overrides Sub OnClosing(ByVal e As System.ComponentModel.CancelEventArgs)
    e.Cancel = True
    Me.Hide()
End Sub

And then set this in your Application?

Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnMainWindowClose

This way, whenever your child windows close, you keep them around for faster display later, but your app still shutsdown when the main window closes (i.e. Exit, Shutdown, etc).

Bob King
A: 

I would like to thank Bob King for his hint and make an addition to his code as C# WPF. It works for me. My application is a tray icon by type. In a WPF XAML form code behind:

protected override void OnInitialized(EventArgs e) { base.OnInitialized(e);

Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnMainWindowClose;

}

private bool m_isExplicitClose = false;// Indicate if it is an explicit form close request from the user.

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)

{

base.OnClosing(e);

if (m_isExplicitClose == false)//NOT a user close request? ... then hide
{
    e.Cancel = true;
    this.Hide();
}

}

private void OnTaskBarMenuItemExitClick(object sender, RoutedEventArgs e)

{
m_isExplicitClose = true;//Set this to unclock the Minimize on close

this.Close();

}

DK