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 :

enter image description here

4
Oystein 20 août 2018 à 11:33

1 réponse

Meilleure 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.

2
Gaurang Dave 20 août 2018 à 12:05