WPF's Window.ShowDialog
method returns a nullable boolean. So does CommonDialog.ShowDialog
.
Now, I understand cases where these would return false (user clicked Cancel or pressed Esc), and when they would return true (code sets Window.DialogResult
to true, probably in response to OK being clicked). But null?
My first thought is that clicking the title bar's Close button might return null. But the docs state (and I confirmed by testing) that the title-bar Close button is treated as a Cancel.
So when would Window.ShowDialog
or CommonDialog.ShowDialog
ever return null?
The method always returns true or false, and this is always equal to the DialogResult property of the window at the time it closes.
But the DialogResult property is null before the window is closed, and another thread could check the property. So it kind of makes sense that the return value is a nullable boolean to match the property, even though it is never actually null.
If I return DialogResult = null in the Click event for a button, the window remains open.
private void OkButton_Click(object sender, RoutedEventArgs e)
{
Button btn = sender as Button;
if ( btn != null )
{
// forces all control to update...
btn.Focus();
}
// TEST IF OK TO CLOSE
bool rc = _vm.ProcessOkCommand();
if (rc)
{
DialogResult = true;
}
else
{
DialogResult = null;
}
}
<Button Content="OK" Name ="cmdOK" IsDefault="True" Click="OkButton_Click"/>
I can give you an example I just encountered. Window.ShowDialog()
will return null when you perform the following steps:
Application
's windows.Window
objects that have been instantiated up until now with the new
keyword are closed.Window
and try calling Window.ShowDialog()
on it. It will return null.This is because, presumably, you have no existing Window
under which your new dialog can bind to in order to behave like a dialog which owns the topmost window state.
A call to window.ShowDialog()
can return null in very special circumstances, which I ran into by chance:
If the window.Closing
event is caught in the following manner
var window = new DialogTestWindow();
window.Closing += (o, e) => { e.Cancel = true; window.Hide(); };
MessageBox.Show(window.ShowDialog().ToString());
then setting DialogResult = true
or DialogResult = false
from the dialog window will cause the window.ShowDialog()
call to return null. Calling Hide()
from the dialog window will cause it to return false.
Edit: The comments in the source code to Window clearly say that the intention is that a call to ShowDialog()
should never return null. However, when Hide() is called from within the Closing
event, the various checks that should prevent this fail: Hide()
sets _dialogResult
to false, but a check for whether the closing of the window has been cancelled subsequently sets it to null.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With