2010-07-23 12 views
8

Ich versuche ein WPF-Fenster zu erstellen, das bereits maximiert geöffnet ist, ohne Größenänderung/Verschiebung (im Systemmenü, noch im Rahmen). Es sollte ständig maximiert werden, außer wenn der Benutzer es minimiert.Wie? WPF-Fenster - Maximiert, Keine Größenänderung/Verschieben

Ich habe versucht, WindowState = "Maximized" und ResizeMode = "CanMinimize", aber wenn das Fenster geöffnet wird, deckt es die Taskleiste (ich will es nicht).

Ich habe einen Haken an WndProc, die die SC_MOVE und SC_SIZE abbricht. Ich kann auch dieses Steuerelement mit Bedingungen in WndProc wie "wenn Befehl ist wiederherstellen und minimiert ist, wiederherstellen, sonst, Block" und so weiter.

Aber mein Punkt ist, wenn wir einen anderen Weg haben, es zu machen. Thankz für lesen Jungs =)

+0

Dies ist ein häufiges Problem in allen Application Frameworks von Windows gefunden. App-Frameworks sind großartig, sie ermöglichen es uns, Anwendungen sehr schnell zu schreiben. Das Problem ist, dass sie nicht jedes mögliche Szenario abdecken können und weil sie den Zweck haben, die wesentlichen Details des zugrundeliegenden Systems zu verbergen, wenn wir feststellen, dass wir nicht-standardmäßiges Verhalten brauchen, müssen wir uns eingraben und "hässlichen" Code schreiben. – Tergiver

+0

Sie möchten ein Fenster, das nur maximiert oder minimiert werden kann, ohne einen normalen Zustand zu haben, der in der Größe geändert werden kann? aber doch nicht Vollbild sein? –

+0

@John Gardner, Es ist genau das, was ich will. –

Antwort

1

Wie Tergiver darauf hingewiesen, ist dies nicht in einer reinen WPF-Art möglich. Sie müssen P/Invoke verwenden. Warum, warum das Fenster die Taskleiste beim Öffnen abdeckt, denke ich, dass Sie einige erforderliche Anrufe verpfuschen, indem Sie SC_MOVE und SC_SIZE abbrechen. Vielleicht sollten Sie diese Anrufe nach dem Laden des Fensters abbrechen.

+0

PInvozieren ????? Wie wäre es im Fenster Konstruktor? // Verhindern, dass das Fenster die Taskleiste überlappt 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

Dieser Code verhindert nur, dass das Fenster verschoben oder maximiert wird. Wenn Sie stattdessen SC_SIZE verwenden, wird das Fenster maximiert und minimiert, aber nicht in der Größe geändert. const int SC_SIZE = 0xF000; In meinem Fenster xaml verwende ich WindowState = "Minimized" und ResizeMode = "CanResize" –

12

Es ist notwendig, WindowState="Maximized" ResizeMode="NoResize" in XAML des Fensters zu schreiben:

<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

Einstellung der WindowState = "maximiert" ist nicht mit der SplashScreen-Funktion kompatibel (Ihr Hauptfenster wird den Begrüßungsbildschirm ausblenden). Wenn Sie Maximized nicht starten, verhindert ResizeMode = "NoResize", dass das Fenster maximiert wird. –

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

Window = "None" tun, was Sie wollen, aber ... Sie den Fenstertitel verlieren, in der Nähe Knopf und habe andere Probleme.

Besuche WindowStyle="None" some problems