Massimizza la finestra WPF nella schermata corrente

Ho un’applicazione wpf senza windows, ogni volta che imposto lo stato della finestra come massimizzato lo massimizza sul display principale.

Quello che mi piacerebbe fare è massimizzare su quale mai visualizzare l’applicazione è in esecuzione.

Quindi qualche idea su come lo farei?

Il mio codice al momento è giusto

private void titleBarThumb_MouseDoubleClick(object sender, MouseButtonEventArgs e) { if (this.WindowState == System.Windows.WindowState.Normal) { this.WindowState = System.Windows.WindowState.Maximized; } else { this.WindowState = System.Windows.WindowState.Normal; } } 

Ho incluso questa linea sul mio costruttore MainWindow (primo controllo):

 Application.Current.MainWindow.WindowState = WindowState.Maximized; 

A causa della barra delle applicazioni, è necessario utilizzare le dimensioni dell’area di lavoro dell’utente:

 this.Width=SystemParameters.WorkArea.Width; this.Height=SystemParameters.WorkArea.Height; 

Puoi usarlo nel costruttore della vista

Non sono sicuro che questa risposta sia già stata – ho creato un’app di esempio con

 WindowStyle = WindowStyle.None; 

Ho creato un pulsante e sul gestore dei clic ha fatto questo-

 WindowState = WindowState.Maximized 

Ho collegato il gestore MouseLeftButtonDown per il trascinamento della finestra dalla finestra

 this.MouseLeftButtonDown += new(MainWindow_MouseLeftButtonDown); private void MainWindow_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { DragMove(); } 

Quando ho trascinato la mia finestra sul mio secondo monitor e ho fatto clic sul pulsante di ingrandimento, è stata ingrandita nella finestra corrente, non nella finestra di avvio. Stavo usando VS2010 e .NET 4. Fammi sapere se questo aiuta.

Una domanda con 7 upvotes merita la risposta corretta. : D

Usa questa finestra invece della normale finestra e Maxmize / Minimize / normalize si prenderà cura di se stessa.

 using System; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Interop; public partial class MyWindow : Window { public MyWindow () { this.InitializeComponent(); this.SourceInitialized += this.OnSourceInitialized; } #endregion #region Methods private static IntPtr WindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { switch (msg) { case 0x0024: WmGetMinMaxInfo(hwnd, lParam); handled = true; break; } return (IntPtr)0; } private static void WmGetMinMaxInfo(IntPtr hwnd, IntPtr lParam) { var mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO)); // Adjust the maximized size and position to fit the work area of the correct monitor IntPtr monitor = MonitorFromWindow(hwnd, (int)MonitorFromWindowFlags.MONITOR_DEFAULTTONEAREST); if (monitor != IntPtr.Zero) { var monitorInfo = new MONITORINFO(); GetMonitorInfo(monitor, monitorInfo); RECT rcWorkArea = monitorInfo.rcWork; RECT rcMonitorArea = monitorInfo.rcMonitor; mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.Left - rcMonitorArea.Left); mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.Top - rcMonitorArea.Top); mmi.ptMaxSize.x = Math.Abs(rcWorkArea.Right - rcWorkArea.Left); mmi.ptMaxSize.y = Math.Abs(rcWorkArea.Bottom - rcWorkArea.Top); } Marshal.StructureToPtr(mmi, lParam, true); } private void OnSourceInitialized(object sender, EventArgs e) { var window = sender as Window; if (window != null) { IntPtr handle = (new WindowInteropHelper(window)).Handle; HwndSource.FromHwnd(handle).AddHook(WindowProc); } } } 

Importazioni e dichiarazioni DLL

 [StructLayout(LayoutKind.Sequential)] public struct MINMAXINFO { public POINT ptReserved; public POINT ptMaxSize; public POINT ptMaxPosition; public POINT ptMinTrackSize; public POINT ptMaxTrackSize; } ; public enum MonitorFromWindowFlags { MONITOR_DEFAULTTONEAREST = 0x00000002 } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public class MONITORINFO { public int cbSize = Marshal.SizeOf(typeof(MONITORINFO)); public RECT rcMonitor; public RECT rcWork; public int dwFlags; } [StructLayout(LayoutKind.Sequential, Pack = 0)] public struct RECT { public int Left; public int Top; public int Right; public int Bottom; public static readonly RECT Empty; public int Width { get { return Math.Abs(this.Right - this.Left); } // Abs needed for BIDI OS } public int Height { get { return this.Bottom - this.Top; } } public RECT(int left, int top, int right, int bottom) { this.Left = left; this.Top = top; this.Right = right; this.Bottom = bottom; } public RECT(RECT rcSrc) { this.Left = rcSrc.Left; this.Top = rcSrc.Top; this.Right = rcSrc.Right; this.Bottom = rcSrc.Bottom; } public bool IsEmpty { get { // BUGBUG : On Bidi OS (hebrew arabic) left > right return this.Left >= this.Right || this.Top >= this.Bottom; } } public override string ToString() { if (this == Empty) { return "RECT {Empty}"; } return "RECT { left : " + this.Left + " / top : " + this.Top + " / right : " + this.Right + " / bottom : " + this.Bottom + " }"; } public override bool Equals(object obj) { if (!(obj is RECT)) { return false; } return (this == (RECT)obj); } public override int GetHashCode() { return this.Left.GetHashCode() + this.Top.GetHashCode() + this.Right.GetHashCode() + this.Bottom.GetHashCode(); } public static bool operator ==(RECT rect1, RECT rect2) { return (rect1.Left == rect2.Left && rect1.Top == rect2.Top && rect1.Right == rect2.Right && rect1.Bottom == rect2.Bottom); } public static bool operator !=(RECT rect1, RECT rect2) { return !(rect1 == rect2); } } [DllImport("user32.dll", SetLastError = true)] public static extern bool GetMonitorInfo(IntPtr hMonitor, MONITORINFO lpmi); [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr MonitorFromWindow(IntPtr handle, int flags); 

Guarda questa domanda e rispondi: Come centrare un’app WPF sullo schermo?

È ansible utilizzare le funzioni descritte in Windows.Forms.Screen per ottenere la schermata corrente. Quindi magari impostare la StartupLocation di Windows su questa schermata (prima di massimizzare come hai già fatto) può ottenere quello che vuoi, ma non mi sono preso il tempo di provarlo da solo, a dire il vero.

Ho fatto una domanda simile che potresti trovare utile. Come posso creare una finestra WPF ingrandita sullo schermo con il cursore del mouse?

Non possiamo ingrandire la finestra finché non viene caricata. Quindi agganciando l’evento Loaded di fullScreenWindow e gestendo l’evento lungo le linee di:

 private void Window_Loaded(object sender, RoutedEventArgs e) { WindowState = WindowState.Maximized; } 

L’applicazione c # inizia prima sul display principale, a meno che non venga spostato il codice funzionerà. Tuttavia, se la tua app wpf verrà spostata su un altro display, la nuova posizione potrà essere registrata e memorizzata in un file di configurazione locale. Ma la tua app non avrà bordi o altri controlli nativi, quindi dovrai anche implementare il bit in movimento. e quando la finestra viene spostata, sarà ansible acquisire l’indice di visualizzazione utilizzando SystemParameters.

In bocca al lupo

Ho appena incontrato lo stesso problema. Nel mio caso si è scoperto il fatto che nascondevo la mia finestra pop-up quando avevo finito. Quindi se la chiamassi la prossima volta e lo chiedessi di ingrandire, lo farebbe sullo schermo originale. Una volta che ho iniziato a chiuderlo, invece, ha iniziato a massimizzare sullo schermo corretto.

Ho fatto in modo che la mia applicazione venisse massimizzata nello schermo secondario

Aggiungi questo nella parte superiore della finestra principale:

 using Screen = System.Windows.Forms.Screen; 

Aggiungi questo nel gestore di ingrandimento:

 private void AdjustWindowSize() { if (this.WindowState == WindowState.Maximized) { this.WindowState = WindowState.Normal; } else { System.Drawing.Rectangle r = Screen.GetWorkingArea(new System.Drawing.Point((int)this.Left, (int)this.Top)); this.MaxWidth = r.Width; this.MaxHeight = r.Height; this.WindowState = WindowState.Maximized; } } 

Eccoci qui !