2010-07-23 9 views
8

Próbuję utworzyć okno WPF, które zostanie otwarte już zmaksymalizowane, bez zmiany rozmiaru/ruchu (w menu systemowym, ani w ramce). Powinien być cały czas zmaksymalizowany, chyba że użytkownik zminimalizuje go.Jak? Okno WPF - zmaksymalizowane, bez zmiany rozmiaru/ruchu

Próbowałem umieścić WindowState = "Maksymalizowany" i ResizeMode = "CanMinimize", ale kiedy otworzy się okno, obejmuje pasek zadań (nie chcę tego).

Mam hak do WndProc, który anuluje SC_MOVE i SC_SIZE. Mogę również wykonać tę kontrolę z warunkami w WndProc, jak "jeśli polecenie jest przywracane i jest zminimalizowane, przywrócić, inaczej, zablokować" i tak dalej.

Ale moim celem jest, jeśli mamy inny sposób, aby to zrobić. Thankz for read guys =)

+0

Jest to typowy problem występujący we wszystkich aplikacjach systemu Windows. Szkielety aplikacji są świetne, pozwalają nam bardzo szybko pisać aplikacje. Problem polega na tym, że nie są w stanie objąć wszystkich możliwych scenariuszy, a ich celem jest ukrycie nijakich, drobiazgowych szczegółów systemu bazowego, gdy stwierdzimy, że potrzebujemy niestandardowego zachowania, które musimy wkopać i napisać "brzydki" kod. – Tergiver

+0

Potrzebujesz okna, które można zmaksymalizować lub zminimalizować tylko bez normalnego stanu, który można zmienić/przenieść? ale nie być pełnoekranowym? –

+0

@John Gardner, Dokładnie tego chcę. –

Odpowiedz

1

Jak zauważył Tergiver, nie jest to możliwe w sposób czysto WPF. Musisz użyć P/Invoke. Jeśli chodzi o to, dlaczego okno obejmuje pasek zadań po otwarciu, myślę, że zepsułeś niektóre wymagane połączenia, anulując SC_MOVE i SC_SIZE. Może powinieneś anulować te połączenia po załadowaniu okna.

+0

Wywołanie ????? Co powiesz na to w konstruktorze okien? // Zapobieganie nakładaniu się okna na pasek zadań 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

Ten kod po prostu uniemożliwi przeniesienie lub zmaksymalizowanie okna. Jeśli zamiast tego użyjesz SC_SIZE, możesz zmaksymalizować i zminimalizować okno, ale nie zmienisz rozmiaru. const int SC_SIZE = 0xF000; W moim oknie xaml używam WindowState = "Zminimalizowany" i ResizeMode = "CanResize" –

12

Konieczne jest, aby napisać WindowState="Maximized" ResizeMode="NoResize" w XAML w oknie:

<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

Ustawienie WindowState = "Maksymalizuj" jest niezgodne z funkcją SplashScreen (twoje główne okno ukryje ekran powitalny). A jeśli nie zaczniesz Zmaksymalizowany, ResizeMode = "NoResize" uniemożliwi maksymalizację okna. –

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

WindowStyle = "Brak" Rób, co chcesz, ale ... można stracić tytuł okna, blisko i mam inne problemy.

Odwiedź WindowStyle="None" some problems