Ne peut pas définir de DialogResult dans WPF
Je montre une fenêtre WPF utilisant ShowDialog() de la fenêtre appelante. La fenêtre s'ouvre et elle est modale comme prévu. Cependant, dans mon OK et Annuler bouton cliquez sur les événements dans la fenêtre de dialogue que j'ai mis ce.DialogResult = vrai (ou faux), respectivement, et la valeur n'a pas obtenir de l'ensemble. La fenêtre se ferme comme prévu, mais DialogResult est toujours null.
Est-ce un bug dans WPF? Ou est-il une raison pour laquelle la propriété DialogResult ne peut pas être définie, mais ne jetez pas une exception? La fenêtre n'est pas hébergé dans un navigateur.
Code dans la fenêtre appelante:
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;
- Comment vous mettez-vous DialogResult à un bool? Il devrait être un enum, comme DialogResult.OK
- Non, en WPF, si vous ouvrez un objet de la Fenêtre avec ShowDialog() la méthode, vous pouvez définir DialogResult à une valeur booléenne.
- Pouvez-vous poster le contenu de votre
<Window ... />
définition ici? C'est peut-être quelque chose de particulier à la façon dont vous avez l'initialisation de la fenêtre. - Qu'est ce que Window2? Avez-vous tirer de votre propre Fenêtre de la classe à partir de la Fenêtre? Ensuite, c'est probablement quelque chose de mal dans votre Window2 de classe, vous devez poster le code source de cela.
- Je viens de tomber sur ce problème et il semble être un bug lors de la dérivation à partir de votre propre classe de Fenêtre. Vous ne savez pas comment le résoudre.
Vous devez vous connecter pour publier un commentaire.
DialogResult
est nullable bool. Cependant, vous n'avez pas à jeter pour obtenir sa valeur.L' ?? 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#)
Comme pour la question d'origine, la seule fois que j'ai vu et de les remonter ce problème se produit lorsque la fenêtre était disposé entre le réglage de la DialogResult et la fermeture de la fenêtre. Malheureusement, le seul conseil que je peux offrir est pour vous, étape par le biais de votre code et de vérifier l'ordre des opérations. Je crois que j'ai "fixé" par réglage de la
DialogResult
et puis explicitement la fermeture de la fenêtre.result == true
. Je pense que c'est plus lisible, j'aurais penser à ce que??
fait ici.result == true
est une bête noire de la mine.== true
est implicite. Si vous êtes à la recherche pour une meilleure lisibilité, je vous suggère de nommer vos variables après ce qu'ils représentent. exemple:bool? isOK = myWindow.Dialog(); if (isOK ?? false) { ... }
== true
est jamais implicite avec unbool?
Bien 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
Pour ce qui est nul... je ne vois pas pourquoi ça devrait se passer, à moins d'être en quelque sorte la valeur null APRÈS avoir été mis à true ou false. Peux-tu montrer ton code?
EDIT:
Votre code a bien fonctionné pour moi, c'est ce que j'ai dans la deuxième fenêtre:
Et dans Window1:
Est-il une grande différence?
J'ai juste eu exactement le même problème et il semble être causé par mon remplaçant la OnClosing() la méthode. J'avais besoin de remplacer OnClosing() pour arrêter l'utilisateur de la fermeture de la fenêtre modale via le bouton fermer (X).
Quand je commenter la OnClosing() la méthode, le problème disparaît et la DialogResult est retourné avec les valeurs attendues de vrai ou de faux, en tant qu'ensemble.
Pour l'intérêt ici était ma gestionnaires de clic de bouton et OnClosing méthode:
DialogResult
setter appelsClose
lien. Votre OnClosing gestionnaire d'événement ensemblese.Cancel
qui, apparemment, réinitialiseDialogResult
. La solution est d'abord de définirbuttonHasBeenClicked
(pour éviter l'annulation de la fermeture), puis mis enDialogResult
.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 :
et après le réglage de mon DialogResult il fonctionne pour moi !! ( très étrange question ).
c'était le code que j'ai été en utilisant :
et à ouvrir ma boite de dialogue :
Avez-vous fermer la fenêtre avant de u définir le DialogResult?
Vous devez afficher l'ensemble du contenu de votre événement bouton-gestionnaires.
Je viens de tomber sur le problème de trop. Il s'avère que j'avais mis de DialogResult à l'intérieur d'un corset, d'une instruction if et pour cette raison (aussi étrange que cela puisse paraître) a provoqué l'erreur. Dès que cette seule ligne a été supprimée, le problème a été résolu.
J'ai le texte suivant dans la fenêtre de dialogue de la page. (dialogwindow.xaml.cs)
Dans l'appel de la page, j'ai utilisé le dialogwindow comme ceci:
Le problème est dû à la durée de vie de la forme:
Dialogue événement
private void _loginViewModel_LoginEvent(object sender, LoginViewModel.LoginEventArgs e)
{
DialogResult = true;
c'.Close();
}
Travaux:
Ne fonctionne PAS:
J'ai eu un problème similaire, mais mon problème est venu du code dans ma déclaration de clôture. J'ai essayé d'en Disposer() une Liste avant de la fenêtre est fermée, et ensuite définir la Liste des<> propriété à null... c'était l'étouffement sur l'ensemble de la propriété quand j'ai essayé de régler sa valeur à null alors je suis venu avec la suite maladroit solution de contournement dans ma propriété d'ensemble de la méthode et tout a fonctionné par la suite: