2014-10-03 4 views
0

Вопрос был asked here, но ни одно из предоставленных решений не работало с .NET 4.0/Win7/8.1. Ответ вращается вокруг того, чтобы не устанавливать MaximizeBox в false, но следующий фрагмент показывает, что он не работает (т. Е. Форма все равно покрывает весь экран (проверена на Win7 и 8.1 с помощью ClassicShell). Мне нужно, чтобы это работало на нескольких экранах, и установка MaximumSize doesn Не работайте очень хорошо: когда форма не максимизируется, пользователю должно быть разрешено иметь ширину формы, охватывающую два монитора. Также нет события BeforeMaximize. Поэтому вы не можете просто установить MaximumSize в событие OnMove.Максимальное закрытие формы без полей на панели задач

public TestForm() 
{ 
    InitializeComponent(); 

    FormBorderStyle = FormBorderStyle.None; 
    WindowState = FormWindowState.Maximized; 
} 

VS2013, кажется, быть в состоянии сделать это без покрытия панели задач

EDIT:. Установка MaximizedBounds (как ответил Ханс Пассант) не работает на вторичном экране, где вторичный экран больше первичного. (примечание: следующая измененная версия ответа Ганса, поскольку он просто не работал на вторичном экране)

например.

protected override void OnLocationChanged(EventArgs e) 
{ 
    var workArea = Screen.FromControl(this).WorkingArea; 
    MaximizedBounds = new Rectangle(0, 0, workArea.Width, workArea.Height); 
    Debug.WriteLine(MaximizedBounds); 

    base.OnLocationChanged(e); 
} 

// Button click event (hit when form maximized): 
WinApi.RECT rect; 
WinApi.GetWindowRect(Handle, out rect); 
Debug.WriteLine(rect); 

Выход:

OnLocationChanged: {X=0,Y=0,Width=1920,Height=1040}

ButtonClick when form is maximized: {Left=1366,Top=-216,Right=3840,Bottom=876}

Это работает, чтобы быть:

максимизируется Ширина = 3840 - 1366 = 2474

Maximized Высота = 876 + 216 = 1092

Откуда взялись эти рамки?

+1

Добавление еще одну строки в коду выше, с самым высоким голосовавшим ответа работает. 'MaximumSize = Screen.FromControl (this) .WorkingArea.Size;' –

+0

Отредактировал вопрос, чтобы объяснить, почему 'MaximumSize' не работает для нескольких мониторов. –

+0

Назначьте свойство MaximizedBounds формы. –

ответ

0

Если безграничный окно покрывает панель задач вы можете сделать это:

this.FormBorderStyle = FormBorderStyle.Sizable; 
this.WindowState = FormWindowState.Maximized; 
this.MaximumSize = this.Size; 
this.FormBorderStyle = FormBorderStyle.None; 
this.WindowState = FormWindowState.Normal; 

Это сделать это следующим образом: При загрузке максимизирует окно с полями и устанавливает максимальный размер до максимума с границей - это ISN» t охватывает панель задач. После этого он удаляет границу и возвращает окно в нормальное состояние. Добавьте этот фрагмент, чтобы загрузить раздел. Извините за возможные ошибки, я из Польши :)

0

поздно к этой партии - в любом случае - это работает для меня:

Screen screen = Screen.FromControl(this); 
int x = screen.WorkingArea.X - screen.Bounds.X; 
int y = screen.WorkingArea.Y - screen.Bounds.Y; 
this.MaximizedBounds = new Rectangle(x, y, 
    screen.WorkingArea.Width, screen.WorkingArea.Height); 
this.MaximumSize = screen.WorkingArea.Size; 
this.WindowState = FormWindowState.Maximized;