Impossible de définir DialogResult dans WPF

j'affiche une fenêtre WPF en utilisant ShowDialog () depuis la fenêtre d'appel. La fenêtre s'ouvre et est modale comme prévu. Cependant, dans ma fenêtre de dialogue OK and Cancel click events, j'ai paramétré ceci.DialogResult = true (ou false) respectivement, et la valeur n'est pas définie. La fenêtre se ferme comme prévu, mais DialogResult est toujours null.

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 et ne fait pas exception? La fenêtre n'est pas hébergé 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;
26
demandé sur Dave Clemmer 2009-05-22 20:18:06

9 réponses

DialogResult est nullable bool. Cependant, vous n'avez pas à jeter pour obtenir sa valeur.

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

le ?? définit la valeur par défaut de revenir si le résultat est null. Plus d'informations: Utilisation De Types Nullables (Guide De Programmation C#)

pour ce qui est de la question originale, la seule fois où j'ai vu et retracé ce problème, c'est lorsque la fenêtre était en train d'être réglée entre le réglage du DialogResult et la fermeture de la fenêtre. Malheureusement, le seul conseil que je peux offre est pour vous passer par votre code et de vérifier l'ordre des opérations. Je crois que je l'ai" réparé " en mettant le DialogResult et ensuite fermer explicitement la fenêtre.

18
répondu Dennis 2017-04-12 18:09:13

tout d'abord, vous devez prendre en compte qu'il retourne nullable booléen (bool?), afin de comparer ou d'une autre variable, vous devez la convertir en une régulières bool

bool result = (bool)myWindow.DialogResult;

pour ce qui est de la valeur null... Je ne vois pas pourquoi cela devrait se produire, à moins que ce ne soit en quelque sorte être ramené à null après avoir été réglé à true ou false. Pouvez-vous montrer votre code?

EDIT:

Votre code a bien fonctionné pour moi, c'est 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
    }
}

Est-il une grande différence?

9
répondu Carlo 2009-05-22 16:53:33

j'ai juste eu exactement le même problème et il semble qu'il soit causé par mon dépassement de la méthode OnClosing (). J'avais besoin de surcharger OnClosing() pour empêcher l'utilisateur de fermer la fenêtre modale via le bouton Fermer (X).

quand je commente la méthode OnClosing (), le problème disparaît et le résultat du dialogue est retourné avec les valeurs attendues de true ou false, comme défini.

pour plus d'intérêt voici mon bouton click handlers et OnClosing méthode:

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;
    }
}
6
répondu dodgy_coder 2011-11-08 07:21:46

j'ai eu ce problème aussi, et le seul moyen que j'ai trouvé pour le fixer a l'aide de ce code dans ma Classe :

public new bool? DialogResult { get; set; }

et après avoir mis en place mon DialogResult ça marche pour moi !! ( très étrange question ). c'était le code que j'ai été en utilisant :

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
répondu Ehsan Zargar Ershadi 2011-12-11 04:06:54

fermez-vous la fenêtre avant que vous ne posiez le DialogResult? Vous devez afficher l'ensemble du contenu de votre événement bouton-gestionnaires.

2
répondu batzen 2009-06-12 15:16:51

je viens de rencontrer le problème aussi. Il s'avère que J'avais placé DialogResult à l'intérieur d'une accolade D'une instruction IF et pour cette raison (aussi étrange que cela puisse paraître) causé l'erreur. Dès que cette ligne unique a été enlevé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
répondu dracore 2013-11-11 19:06:32

j'ai ce qui suit dans 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
répondu Kishore 2016-02-10 22:55:45

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

boîte de Dialogue de l'événement private void _loginViewModel_LoginEvent (object sender, LoginViewModel.LoginEventArgs e) { DialogResult = true; ce.Proche(); }

Fonctionne:

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

ne fonctionne pas:

var result = new Login().ShowDialog();
0
répondu jlo-gmail 2018-07-17 16:27:52

j'avais un problème similaire, mais mon problème venait du code dans ma déclaration finale. J'essayais de disposer() d'une liste avant la fermeture de la fenêtre, puis de définir la propriété List<> à null... il s'étouffait sur la propriété set lorsque j'essayais de définir sa valeur à null, alors j'ai trouvé la solution de contournement maladroite suivante dans ma méthode de propriété set et tout a fonctionné par la suite:

    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();
            }
        }
    }
-1
répondu Christopher Jordan 2017-06-16 22:43:12