2010-07-23 4 views
8

Я пытаюсь сделать окно WPF, которое открывается уже максимально, без изменения размера/перемещения (в системном меню или на границе). Он должен быть максимизирован все время, кроме случаев, когда пользователь минимизирует его.Как это сделать? Окно WPF - Максимизировано, без изменения размера/перемещения

Я попытался поместить WindowState = "Maximized" и ResizeMode = "CanMinimize", но когда откроется окно, оно закрывает панель задач (я не хочу этого).

У меня есть крючок к WndProc, который отменяет SC_MOVE и SC_SIZE. Я также могу сделать этот элемент управления с условиями в WndProc как «если команда восстанавливается и сведена к минимуму, восстанавливается, else, block» и т. Д.

Но я хочу сказать, что если у нас есть другой способ сделать это. Thankz for read guys =)

+0

Это общая проблема во всех Windows-приложений рамочные. Рамки приложений отличные, они позволяют нам писать приложения очень быстро. Проблема в том, что они не могут охватить все возможные сценарии и потому, что их цель - скрыть ничтожные подробные детали базовой системы, когда мы обнаружим, что нам нужно иметь нестандартное поведение, которое мы должны копать и писать «уродливый» код. – Tergiver

+0

Вам нужно окно, которое можно максимизировать или минимизировать только при нормальном состоянии, которое можно изменить или изменить? но еще не полный экран? –

+0

@John Gardner, Это именно то, что я хочу. –

ответ

1

Как указал Тергивер, это невозможно в чисто WPF. Вы должны использовать P/Invoke. Что касается того, почему окно закрывает панель задач при ее открытии, я думаю, что вы перепутаете некоторые требуемые вызовы, отменив SC_MOVE и SC_SIZE. Возможно, вы должны отменить эти вызовы после загрузки окна.

+0

PInvoke ????? Как об этом в конструкторе окна? // Запретить перекрытие окна панели задач 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

Этот код просто предотвратит перемещение или максимизацию окна. Если вместо этого вы используете SC_SIZE, это позволяет максимизировать и минимизировать окно, но не изменять размер. const int SC_SIZE = 0xF000; В моем окне xaml я использую WindowState = «Minimized» и ResizeMode = «CanResize» –

12

Нужно написать WindowState="Maximized" ResizeMode="NoResize" в XAML из окна:

<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

Настройка WindowState = «Максимизировано» несовместима с функцией SplashScreen (ваше главное окно скроет экран заставки). И если вы не начинаете Максимизировать, то ResizeMode = «NoResize» предотвратит максимальное расширение окна. –

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

WindowStyle = "None" делать то, что вы хотите, но ... вы потеряете заголовок окна, близко и есть другие проблемы.

Визит WindowStyle="None" some problems

Смежные вопросы