studio - showdialog c# ejemplo
No se puede establecer DialogResult en WPF (9)
Muestro una ventana WPF usando ShowDialog () desde la ventana de llamada. La ventana se abre y es modal como se esperaba. Sin embargo, en los eventos de clic de mi botón Aceptar y Cancelar en la ventana de diálogo, configuro this.DialogResult = true (o false) respectivamente, y el valor no se establece. La ventana se cierra como se esperaba, pero DialogResult sigue siendo nulo.
¿Es este un error en WPF? ¿O hay una razón por la que la propiedad DialogResult no se puede establecer pero no produce una excepción? La ventana no está alojada en un navegador.
Código en la ventana de llamada:
Window2 win = new Window2();
bool? result = win.ShowDialog();
if (result.HasValue && result.Value) {
//never gets here because result is always null
}
Código en la ventana de diálogo:
this.DialogResult = true;
¿Cierra la ventana antes de configurar u DialogResult? Debes publicar todo el contenido de tus controladores de eventos de botón.
Acabo de encontrarme con el problema también. Resulta que había establecido DialogResult dentro de un corchete de una declaración IF y por este motivo (por extraño que pueda parecer) causó el error. Tan pronto como esta única línea fue eliminada, el problema fue resuelto.
private void OKButton_Click(object sender, RoutedEventArgs e)
{
if (!string.IsNullOrEmpty(startBlockPosBox.Text))
{
.. do stuff ..
}
else
{
.. do stuff ..
DialogResult = true; // this line caused the problem
}
DialogResult = true;
}
Acabo de tener exactamente el mismo problema y parece haber sido causado por mi anulación del método OnClosing (). Necesitaba anular OnClosing () para evitar que el usuario cierre la ventana modal mediante el botón de cierre (X).
Cuando comento el método OnClosing (), el problema desaparece y se devuelve DialogResult con los valores esperados de verdadero o falso, según lo establecido.
Para el interés aquí estaban mis controladores de clic de botón y el método OnClosing:
private void AlternateButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = false;
buttonHasBeenClicked = true;
this.Close();
}
private void DefaultButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
buttonHasBeenClicked = true;
this.Close();
}
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
base.OnClosing(e);
if (!buttonHasBeenClicked)
{
// Prevent the user closing the window without pressing one of the buttons.
e.Cancel = true;
}
}
Bueno, primero que todo, hay que tener en cuenta que devuelve un bool que admite nulos (bool?), Por lo que, para compararlo o configurarlo en otra variable, debe convertirlo en un bool regular.
bool result = (bool)myWindow.DialogResult;
En cuanto a que es nulo ... No veo por qué debería suceder, a menos que de alguna manera se restablezca en nulo DESPUÉS de que se establezca en verdadero o falso. ¿Puedes mostrar tu código?
EDITAR:
Tu código funcionó bien para mí, esto es lo que tengo en la segunda ventana:
private void button2_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = false;
}
private void button1_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}
Y en Window1:
private void window1_Loaded(object sender, RoutedEventArgs e)
{
Window2 win = new Window2();
bool? result = win.ShowDialog();
if (result.HasValue && result.Value)
{
//it DID get here
}
}
¿Hay alguna gran diferencia?
El problema se debe a la vida de la forma:
Evento de diálogo privado void _loginViewModel_LoginEvent (objeto remitente, LoginViewModel.LoginEventArgs e) {DialogResult = true; this.Close (); }
Trabajos:
var login = new Login();
var result = login.ShowDialog();
No funciona:
var result = new Login().ShowDialog();
He estado en este problema también, y la única forma que encontré para solucionarlo fue usando este código en mi clase:
public new bool? DialogResult { get; set; }
y después de configurar mi DialogResult, funciona para mí !! (tema muy extraño). Este fue el código que estaba usando:
cmdCancel = new RelayCommand(() => { DataContact.Reload(); this.DialogResult = false; this.Close(); });
y para abrir mi diálogo:
public static MessageBoxResult ShowQuestionYesNo(string message)
{
POLMessageBox w = new POLMessageBox("سوال", MessageBoxType.QuestionYesNo, message);
w.ShowDialog();
var b = w.DialogResult;
if (b == true) return MessageBoxResult.Yes;
if (b == false) return MessageBoxResult.No;
return MessageBoxResult.No;
}
Tengo lo siguiente en la página de la ventana de diálogo. (dialogwindow.xaml.cs)
private void dlgWindowYesButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
this.Close();
}
private void dlgWindowNoButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = false;
this.Close();
}
En la página de llamada usé la ventana de diálogo como esta:
dialogwindow dWinObj = new dialogwindow();
if(dWinObj.ShowDialog().Value == true)
{
//perform the operation when the user clicks "Yes"
}
Tuve un problema similar, pero mi problema provino del código en mi declaración de cierre. Estaba tratando de Desechar () una Lista antes de que se cerrara la ventana, y luego configuré la propiedad Lista <> en nulo ... se estaba atragantando con la propiedad establecida cuando intentaba establecer su valor en nulo, así que encontré el siguiendo una solución torpe en mi método de establecimiento de propiedades y todo funcionó después:
List<SettingItem> settingItems;
public IEnumerable<SettingItem> Settings
{
get
{
return settingItems.OrderBy(t => t.Name).AsEnumerable();
}
set
{
if (value == null)
{
settingItems.Clear();
}
else
{
settingItems = value.ToList();
}
}
}
DialogResult
es un bool anulable. Sin embargo, no tienes que lanzarlo para obtener su valor.
bool? result = myWindow.ShowDialog();
if (result ?? false)
{
// snip
}
Los ?? establece el valor predeterminado para devolver si el resultado es nulo. Más información: Uso de tipos anulables (Guía de programación de C #)
En cuanto a la pregunta original, la única vez que he visto y rastreado este problema es cuando la ventana estaba siendo dispuesta entre la configuración de DialogResult y el cierre de la ventana. Desafortunadamente, el único consejo que puedo ofrecerle es que pase por su código y verifique el orden de las operaciones. Creo que lo "arreglé" configurando DialogResult
y luego cerrando explícitamente la ventana.