J'ai une fenêtre que j'utilise comme boîte de dialogue de connexion dans mon application. Voici le gestionnaire de boutons dans mon modèle de vue MainWindow :
private void LoginDialogButtonPressed(object obj)
{
var vm = new LoginDialogWindowVM(Controller);
var window = new LoginDialogWindow(vm);
window.Owner = Application.Current.MainWindow;
window.ShowDialog();
}
Ma fenêtre de connexion est configurée avec WindowStartupLocation="CenterOwner"
. Maintenant, cela fonctionne bien dans Visual Studio en mode débogage. Mais lors de la création et de l'exécution d'une version, l'ouverture de la boîte de dialogue de connexion lève une exception : « Impossible de définir la propriété Owner sur elle-même ».
Si je laisse tomber le paramètre window.Owner, la fenêtre s'ouvre simplement à une position aléatoire sur le moniteur principal.
Qu'est-ce que je fais de mal ici ? Comment puis-je ouvrir la fenêtre de connexion centrée sur MainWindow sans lever d'exception ?
Voici l'intégralité de l'exception levée :
1 réponse
La raison pour laquelle vous obtenez cette exception est que LoginDialogWindow
est Application.Current.MainWindow
dans votre situation et Application.Current.MainWindow
ne renvoie pas l'objet MainWindow
.
L'un des moyens d'y parvenir est
Passez Window
comme CommandParameter
de View à ViewModel.
<Button Content="OK" Command="{Binding OKCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"/>
Dans ViewModel, définissez la même fenêtre que Owner sur la fenêtre enfant.
private void LoginDialogButtonPressed(object obj)
{
var vm = new LoginDialogWindowVM(Controller);
var window = new LoginDialogWindow(vm);
window.Owner = obj as Window;
window.ShowDialog();
}
Ici, le paramètre object obj
est la fenêtre transmise depuis View.
Questions connexes
De nouvelles questions
c#
C # (prononcé "see sharp") est un langage de programmation multi-paradigme de haut niveau, typé statiquement développé par Microsoft. Le code C # cible généralement la famille d'outils et d'exécutions Microsoft .NET, notamment le .NET Framework, .NET Core et Xamarin. Utilisez cette balise pour les questions sur le code écrit en C # ou en spécification formelle de C #.