Affichage d'une fenêtre avec WPF, Winforms et double moniteur

j'ai 2 moniteurs et une application WinForm qui lance une fenêtre WPF. Je veux obtenir l'écran sur lequel le WinForm est affiché, et montrer la fenêtre WPF sur le même écran. Comment puis-je faire cela?

12
demandé sur codeConcussion 2009-02-04 20:23:50

4 réponses

WPF n'inclut pas le système handy.Windows.Forme. écran classe, mais vous pouvez toujours utiliser ses propriétés pour accomplir votre tâche dans votre application WinForms.

suppose que cette signifie la fenêtre WinForms et _wpfwindow est une variable définie se référant à la fenêtre WPF dans l'exemple ci-dessous (ce serait dans n'importe quel handler de code que vous définissez pour ouvrir la fenêtre WPF, comme un bouton.Cliquer gestionnaire):

Screen screen = Screen.FromControl(this);
_wpfWindow.StartupLocation = System.Windows.WindowStartupLocation.Manual;
_wpfWindow.Top = screen.Bounds.Top;
_wpfWindow.Left = screen.Bounds.Left;
_wpfWindow.Show();

le code ci-dessus instanciera la fenêtre WPF dans le coin supérieur gauche de l'écran contenant votre fenêtre WinForms. Je vous laisse le calcul si vous souhaitez le placer dans un autre endroit comme le milieu de l'écran ou dans un style "en cascade" ci-dessous et à la droite de votre fenêtre WinForms.

une autre méthode qui obtient la fenêtre WPF au milieu de l'écran serait d'utiliser simplement

_wpfWIndow.StartupLocation = System.Windows.WindowStartupLocation.CenterScreen

cependant, ce n'est pas tout à fait aussi flexible parce qu'il utilise la position de la souris pour comprendre quel écran pour afficher la fenêtre WPF (et évidemment la souris pourrait être sur un autre écran que votre application WinForms si l'utilisateur se déplace rapidement, ou vous utilisez un bouton par défaut, ou quoi que ce soit).

Edit: , Voici un lien vers un SDK document sur l'utilisation de l'Interopérabilité pour obtenir votre Fenêtre WPF centré sur la non-Fenêtre WPF. Il n'est, fondamentalement, ce que j'ai été décrire en termes de calcul mathématique, mais correctement vous permet de définir la propriété "propriétaire" de la fenêtre WPF en utilisant le HWND de la fenêtre.

14
répondu Adrian 2009-02-04 18:38:35

voici le moyen le plus simple (utilise WindowStartupLocation.Centrerowner).

MyDialogWindow dialogWindow = new MyDialogWindow();
dialogWindow.Owner = this;
dialogWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;

dialogWindow.ShowDialog();

Pas besoin d'interopérabilité ou de la fenêtre de réglage de la coords :)

6
répondu Simon Brangwin 2009-03-25 01:13:44

une autre façon de le faire est:

WindowInteropHelper helper = new WindowInteropHelper(this);

this.StartupLocation = System.Windows.WindowStartupLocation.Manual;
this.Left = System.Windows.Forms.Screen.FromHandle(helper.Handle).Bounds.Left;
this.Top = System.Windows.Forms.Screen.FromHandle(helper.Handle).Bounds.Top;

c'est votre fenêtre WPF...

3
répondu Joben Blom 2012-08-29 03:46:48

vous devriez pouvoir utiliser le système.Windows.Forme.Screen [1], et utilisez la méthode FromControl pour obtenir les informations de l'écran pour le formulaire. Vous pouvez ensuite l'utiliser pour positionner la fenêtre WPF (en haut, à gauche) en fonction de l'écran sur lequel vous tentez de la localiser.

[1] vous pouvez également utiliser le win32 MonitorFromRect et al, si vous ne chargez pas les WinForms dlls. Cependant, puisque vous avez déjà l'API winforms, vous n'allez pas payer de coup de mémoire/perf.

1
répondu Dominic Hopton 2009-02-04 18:50:08