2010-07-23 22 views
8

Estoy tratando de hacer que una ventana WPF que se abre ya esté maximizada, sin cambio de tamaño/movimiento (en el menú del sistema, ni en el borde). Debe maximizarse todo el tiempo, excepto cuando el usuario lo minimice.¿Cómo? WPF Window - Maximized, No Resize/Move

Intenté poner WindowState = "Maximized" y ResizeMode = "CanMinimize", pero cuando se abre la ventana, cubre la barra de tareas (no lo quiero).

Tengo un gancho para WndProc que cancela SC_MOVE y SC_SIZE. También puedo hacer este control con condiciones en WndProc como "si el comando es restaurar y está minimizado, restaurar, else, bloquear", etc.

Pero mi punto es si tenemos otra forma de hacerlo. Gracias por leer chicos =)

+0

Este es un problema común que se encuentra en todos los entornos de aplicaciones de Windows. Los marcos de aplicaciones son geniales, nos permiten escribir aplicaciones muy rápidamente. El problema es que no pueden cubrir todos los escenarios posibles y, como su propósito es ocultar los detalles esenciales del sistema subyacente, cuando descubrimos que necesitamos un comportamiento no estándar, tenemos que cavar y escribir un código "feo". – Tergiver

+0

¿Desea una ventana que solo se pueda maximizar o minimizar sin un estado normal que se pueda cambiar de tamaño o mover? pero aún no ser pantalla completa? –

+0

@John Gardner, es exactamente lo que quiero. –

Respuesta

1

Como señaló Tergiver, esto no es posible de una manera puramente WPF. Tienes que usar P/Invoke. En cuanto a por qué la ventana cubre la barra de tareas cuando se abre, creo que está estropeando algunas llamadas requeridas al cancelar SC_MOVE y SC_SIZE. Quizás deberías cancelar esas llamadas después de que se haya cargado la ventana.

+0

PInvoke ????? ¿Qué tal esto en el constructor de ventanas? // Impedir que la ventana se superponga a la barra de tareas this.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight; this.MaxWidth = SystemParameters.MaximizedPrimaryScreenWidth; – Califf

2
public Window1() 
    { 
     InitializeComponent(); 

      this.SourceInitialized += Window1_SourceInitialized; 
    } 

    private void Window1_SourceInitialized(object sender, EventArgs e) 
    { 
     WindowInteropHelper helper = new WindowInteropHelper(this); 
     HwndSource source = HwndSource.FromHwnd(helper.Handle); 
     source.AddHook(WndProc); 
    } 

    const int WM_SYSCOMMAND = 0x0112; 
    const int SC_MOVE = 0xF010; 

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
    { 

     switch (msg) 
     { 
      case WM_SYSCOMMAND: 
       int command = wParam.ToInt32() & 0xfff0; 
       if (command == SC_MOVE) 
       { 
        handled = true; 
       } 
       break; 
      default: 
       break; 
     } 
     return IntPtr.Zero; 
    } 
+2

Este código solo evitará que la ventana se mueva o maximice. Si, en cambio, usa SC_SIZE, permite que la ventana se maximice y se minimice, pero no se redimensiona. const int SC_SIZE = 0xF000; En mi ventana xaml utilizo WindowState = "Minimized" y ResizeMode = "CanResize" –

12

Es necesario escribir WindowState="Maximized" ResizeMode="NoResize" en XAML de la ventana:

<Window x:Class="Miscellaneous.EditForm" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Edit Form" WindowState="Maximized" ResizeMode="NoResize"></Window> 
+0

Configurar WindowState = "Maximized" es incompatible con la función SplashScreen (su ventana principal ocultará la pantalla de bienvenida). Y si no inicia Maximized, entonces ResizeMode = "NoResize" evitará que la ventana se maximice. –

0
WindowState="Maximized" 
ResizeMode="NoResize" 
WindowStyle="None" 

WindowStyle = "None" Haz lo que quieras, pero ... se pierde el título de la ventana, cerca botón y tiene otros problemas.

Visita WindowStyle="None" some problems