一个问题是asked here,但提供的解决方案都不适用于.NET 4.0 / Win7 / 8.1。答案围绕未将MaximizeBox设置为false,但以下代码段显示它无法正常工作(即表单无论如何都覆盖整个屏幕(在Win7和8.1上使用ClassicShell进行测试)。我需要在多个屏幕和设置中工作MaximumSize
效果不佳:当表单没有最大化时,应允许用户将表单宽度跨越两个监视器。还没有BeforeMaximize
个事件加入。所以你不能在MaximumSize
事件中设置OnMove
。
public TestForm()
{
InitializeComponent();
FormBorderStyle = FormBorderStyle.None;
WindowState = FormWindowState.Maximized;
}
VS2013似乎能够在不覆盖任务栏的情况下做到这一点。
编辑:设置MaximizedBounds(由Hans Passant回答)在辅助屏幕大于主屏幕的辅助屏幕中不起作用。 (注意:以下是Hans'答案的修改版本,因为他在二级屏幕上无法正常工作)
e.g。
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
最大化高度= 876 + 216 = 1092
框架从哪里获得这些数字?
答案 0 :(得分:1)
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;
答案 1 :(得分:0)
如果您的无边框窗口覆盖任务栏,则可以执行此操作:
this.FormBorderStyle = FormBorderStyle.Sizable;
this.WindowState = FormWindowState.Maximized;
this.MaximumSize = this.Size;
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Normal;
这样做: 在加载时最大化带边框的窗口并将最大尺寸设置为带边框的最大化 - 它不包括任务栏。 在此之后,它删除边框并将窗口返回到正常状态。 将此代码段添加到加载部分。 对不起可能的错误,我来自波兰:)
答案 2 :(得分:0)
这个问题来得很晚,但是在我刚刚使用的.net 4.7.2中
Rectangle wa = Screen.FromControl(this).WorkingArea;
this.MaximumSize = new Size(wa.Width, wa.Height);
WindowState = FormWindowState.Maximized;
线索都在以前的帖子中,但这似乎更简洁。
答案 3 :(得分:0)
我参加派对很晚,但是基于rysieł建议的解决方案,我终于解决了我的问题:
OnLoad
事件:this.FormBorderStyle = FormBorderStyle.Sizable;
this.WindowState = FormWindowState.Maximized;
OnShow
事件:this.MaximumSize = this.Size;
this.FormBorderStyle = FormBorderStyle.None;
答案 4 :(得分:0)
仅将此内容添加到表单的OnResize事件
this.MaximizedBounds = Screen.GetWorkingArea(this);
答案 5 :(得分:0)
我迟到了 6 年,但对于遇到此问题的其他人,这两行应该放在 Form.Load
方法中:
System.Drawing.Rectangle rect = Screen.GetWorkingArea(this);
this.MaximizedBounds = Screen.GetWorkingArea(this);