2009-02-04 9 views

risposta

14

WPF non include i pratici System.Windows.Forms. Classe, ma è comunque possibile utilizzarne le proprietà per eseguire l'attività nell'applicazione WinForms.

Si supponga che questo significa che la finestra WinForms e _wpfWindow è una variabile definita riferimento alla finestra WPF nell'esempio che segue (questo sarebbe in qualunque gestore di codice impostato per aprire la finestra di WPF, come alcuni Button.Click handler):

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

il codice qui sopra un'istanza della finestra WPF in alto a sinistra dello schermo che contiene la finestra WinForms. Lascerò la matematica a te se desideri metterlo in un'altra posizione come il centro dello schermo o in uno stile "a cascata" sotto e alla destra della finestra di WinForms.

Un altro metodo che ottiene la finestra WPF al centro dello schermo sarebbe usare semplicemente

_wpfWIndow.StartupLocation = System.Windows.WindowStartupLocation.CenterScreen 

Tuttavia, questo non è abbastanza flessibile perché utilizza la posizione del mouse per capire quale schermo per visualizzare la finestra WPF (e ovviamente il mouse potrebbe essere su uno schermo diverso come l'app WinForms se l'utente lo sposta velocemente, o si utilizza un pulsante predefinito, o qualsiasi altra cosa).

Modifica: Here's a link to an SDK document sull'utilizzo di InterOp per centrare la finestra di WPF sulla finestra non WPF. Fa fondamentalmente ciò che stavo descrivendo in termini di calcolo matematico, ma correttamente consente di impostare la proprietà "Proprietario" della finestra WPF usando l'HWND di Windows.

1

Dovresti essere in grado di utilizzare System.Windows.Forms.Screen [1] e utilizzare il metodo FromControl per ottenere le informazioni sullo schermo per il modulo. È quindi possibile utilizzarlo per posizionare la finestra WPF (in alto a sinistra) in base alla schermata su cui si sta tentando di localizzarla.

[1] È anche possibile utilizzare Win32 MonitorFromRect et al, se non si caricano le DLL di WinForms. Tuttavia, dal momento che hai già l'API Winforms, non pagherai alcun colpo di memoria/perf.

6

Ecco il modo più semplice (utilizza WindowStartupLocation.CenterOwner).

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

dialogWindow.ShowDialog(); 

Non c'è bisogno di interoperabilità o l'impostazione coordinate window :)

3

Un altro modo di farlo è:

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; 

questo = tua finestra WPF ...