59 votes

WPF WindowStartupLocation="CenterOwner" n'est pas vraiment centré, et s'affiche partout, pourquoi ?

Bien este question et este Les questions sont similaires mais aucune réponse ne fonctionne. En fait, j'espérais que WindowStartupLocation=CenterOwner fonctionnerait... mais ce n'est pas le cas. Il semble centrer la nouvelle fenêtre au centre d'une colonne de la grille, et non au centre de la fenêtre principale. Je suppose donc qu'il pense que c'est le parent. Ensuite, lorsque je ferme la boîte de dialogue et que je l'ouvre à nouveau, elle n'est pas centrée mais déplacée vers le bas et la droite par rapport à la position précédente. Et si je déplace la fenêtre principale sur un deuxième moniteur, la fenêtre popup s'ouvre toujours sur le moniteur par défaut. Ces propriétés sont-elles erronées ou est-ce que je pense simplement que cela devrait fonctionner d'une manière différente ? Je suppose que je pourrais calculer les propriétés Haut et Gauche manuellement. Je veux simplement que la fenêtre popup soit centrée dans la fenêtre principale, où qu'elle se trouve.

100voto

Carlo Points 8638

Probablement parce que vous n'avez pas défini le propriétaire :

this.Owner = App.MainWindow; // for example

C'est comme ça que je fais et ça centre la fenêtre parfaitement tout le temps.

Pour prolonger le commentaire de Will Eddins, vous pouvez créer une méthode de surcharge pour ShowDialog() ou Show() dans votre fenêtre :

public void ShowDialog(Window owner)
{
    this.Owner = owner;
    this.ShowDialog();
}

public void Show(Window owner)
{
    this.Owner = owner;
    this.Show();
}

Ou surcharger un constructeur :

public MyWindow(Window owner)
    : this()
{
    this.Owner = owner;
}

8 votes

Vous pouvez également définir le propriétaire avant d'appeler .Show() o .ShowDialog() sur la fenêtre : window.Owner = this;

2 votes

Doh, tu dois te moquer de moi. Cela m'a déjà piqué avant dans winforms. Maudite chose. Ne pouvez-vous pas attribuer par défaut votre propriétaire à celui qui vous a instancié ?

0 votes

Haha, vous pourriez créer une surcharge du constructeur qui prend le propriétaire, je vais ajouter un exemple dans la réponse.

7voto

Elken Points 84

Si vous créez une extension pour cela, vous pourriez réutiliser cette bonne idée :

/// <summary>
/// Opens a window modally, with an owner
/// </summary>
/// <param name="window">The window to open</param>
/// <param name="opener">The owner of the window getting opened</param>
/// <returns>window.ShowDialog()</returns>
public static bool? ShowDialog(this Window window, Window opener)
{
    window.Owner = opener;
    return window.ShowDialog();
}

4voto

Xnyton Points 21

En outre, nous pouvons utiliser :

this.Owner = App.Current.MainWindow;

Ou Application au lieu de App .
Et le placer dans un enfant constructeur de fenêtre :

    public partial class ChildWindow : Window
    {
        public ChildWindow()
        {
            InitializeComponent();

            DataContext = new ChildWindowViewModel();

            this.Owner = App.Current.MainWindow;
        }
    }

1voto

kenkenes Points 11

J'ai eu le même problème... mais c'était surtout dû au fait que, lorsque je voulais me débarrasser de la fenêtre enfant, j'utilisais hide() au lieu de close() ... donc quand vous la rouvrez, parce qu'elle était cachée et non fermée, quand la fenêtre parent est déplacée, elle s'ouvre toujours à son emplacement de départ...

Ainsi, lorsque vous fermez la fenêtre enfant au lieu de la masquer, par exemple lorsque vous avez fini de travailler avec elle.

0voto

Dan Points 538

Une autre cause possible est le réglage DataContext après InitializeComponent() s'appelle.

Si vous avez du code-behind comme ceci :

    public CustomWindow(CustomViewModel viewModel)
    {
        InitializeComponent();
        DataContext = viewModel;
    }

Changez-le en :

    public CustomWindow(CustomViewModel viewModel)
    {
        DataContext = viewModel;
        InitializeComponent();
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X