web-dev-qa-db-fra.com

Impossible de définir DialogResult dans WPF

Je montre une fenêtre WPF en utilisant ShowDialog () à partir de la fenêtre appelante. La fenêtre s'ouvre et est modale comme prévu. Cependant, dans les événements de clic de mes boutons OK et Annuler de la fenêtre de dialogue, je définis respectivement this.DialogResult = true (ou false) et la valeur n'est pas définie. La fenêtre se ferme comme prévu, mais DialogResult est toujours nul. 

Est-ce un bug dans WPF? Ou y a-t-il une raison pour laquelle la propriété DialogResult ne peut pas être définie alors qu'elle ne génère pas d'exception? La fenêtre n'est pas hébergée dans un navigateur.

Code dans la fenêtre d'appel: 

Window2 win = new Window2();
bool? result = win.ShowDialog();
if (result.HasValue && result.Value) {
   //never gets here because result is always null
}

Code dans la fenêtre de dialogue:

this.DialogResult = true;
28
quinnapi

DialogResult est un booléen nullable. Cependant, vous n'êtes pas obligé de le lancer pour en obtenir la valeur. 

bool? result = myWindow.ShowDialog();
if (result ?? false)
{
  // snip
}

Le ?? définit la valeur par défaut à renvoyer si le résultat est null. Plus d'informations: Utilisation de types nullables (Guide de programmation C #)

En ce qui concerne la question initiale, la seule fois où j'ai pu voir et suivre ce problème, c'est lorsque la fenêtre a été supprimée entre la définition de DialogResult et la fermeture de la fenêtre. Malheureusement, le seul conseil que je puisse vous donner est de vous guider dans votre code et de vérifier l’ordre des opérations. Je crois que je l'ai "corrigé" en définissant la variable DialogResult puis en fermant explicitement la fenêtre. 

18
Dennis

Tout d’abord, vous devez prendre en compte le fait qu’il retourne un bool nullable (bool?), Donc pour le comparer ou le définir sur une autre variable, vous devez le lancer en bool normal.

bool result = (bool)myWindow.DialogResult;

Quant à sa nullité ... Je ne vois pas pourquoi cela devrait arriver, à moins que sa valeur ne soit remise à null APRÈS être définie sur true ou sur false. Pouvez-vous montrer votre code?

MODIFIER:

Votre code a bien fonctionné pour moi, voici ce que j'ai dans la deuxième fenêtre:

private void button2_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = false;
}

private void button1_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = true;
}

Et dans 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
    }
}

Y a-t-il une grande différence?

11
Carlo

Je viens d'avoir exactement le même problème et cela semble être causé par le fait que j'ai redéfini la méthode OnClosing (). J'avais besoin de remplacer OnClosing () pour empêcher l'utilisateur de fermer la fenêtre modale via le bouton de fermeture (X).

Lorsque je commente la méthode OnClosing (), le problème disparaît et le DialogResult est renvoyé avec les valeurs attendues de true ou de false, définies.

Pour mon intérêt, voici mes gestionnaires de clics sur les boutons et ma méthode 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;
    }
}
7
dodgy_coder

J'ai aussi été confronté à ce problème, et la seule solution que j'ai trouvée pour le résoudre consistait à utiliser ce code dans ma classe:

public new bool? DialogResult { get; set; }

et après avoir réglé mon DialogResult, ça marche pour moi !! (très étrange problème) ... c'était le code que j'utilisais:

cmdCancel = new RelayCommand(() => { DataContact.Reload(); this.DialogResult = false; this.Close(); });

et pour ouvrir mon dialogue:

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;
        }
3

Fermez-vous la fenêtre avant de définir DialogResult? Vous devez publier tout le contenu de vos gestionnaires d’événements de boutons.

2
batzen

Le problème est dû à la vie de la forme:

Evénement de dialogue void privé _loginViewModel_LoginEvent (expéditeur d'objet, LoginViewModel.LoginEventArgs e) { DialogResult = true; this.Close (); }

Travaux:

var login = new Login();
var result = login.ShowDialog();

Ne marche pas:

var result = new Login().ShowDialog();
0
jlo-gmail

J'ai juste rencontré le problème aussi. Il s'avère que j'avais placé DialogResult dans une accolade d'une instruction IF et que pour cette raison (aussi étrange que cela puisse paraître), j'ai causé l'erreur. Dès que cette ligne unique a été supprimée, le problème a été résolu.

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;
    }
0
dracore

J'ai ce qui suit dans la page de la fenêtre de dialogue. (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();
    }

Dans la page d'appel, j'ai utilisé la fenêtre de dialogue comme ceci:

dialogwindow dWinObj = new dialogwindow();
if(dWinObj.ShowDialog().Value == true)
{
  //perform the operation when the user clicks "Yes"
}
0
Kishore