4

这是一个如此平凡的问题,我认为我可以立即解决它,但没有。我的表单大小和位置在退出时保存在应用程序设置中,以便下次运行应用程序时恢复。如果用户在最小化表单时关闭表单,我将无法恢复到正常状态。表单恢复为最小化,单击任务栏按钮什么也不做。我在 FormClosing 事件中保存了位置和大小,但如果表单被最小化,我将保存最小化的大小(160、40)和位置(-32000、-32000),这对于恢复表单是完全不正确的。我想强制表单从不恢复最小化,而是恢复到最后的正常大小和位置。不知何故,我必须在表单最小化并保存之前捕获大小和位置,然后在 FormClosing 上,如果表单最小化,则不保存大小和位置。这可能不是100%清楚,

FormClosing 处理程序:

    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        Settings.Default.WindowLocation = Location;
        Settings.Default.WindowSize = Size;
        Settings.Default.WindowState = WindowState;
        Settings.Default.Save();
    }

恢复代码:

    private void RestoreWindow()
    {
        Location = Settings.Default.WindowLocation;
        if(Location.X == 0 && Location.Y == 0)
            StartPosition = FormStartPosition.CenterScreen;

        Size = Settings.Default.WindowSize;

        WindowState = FormWindowState.Normal;

        if(Size.Width > Screen.PrimaryScreen.WorkingArea.Width)
        {
            Location = new Point(0, Location.Y);
            Size = new Size(Screen.PrimaryScreen.WorkingArea.Width, Size.Height);
        }

        if(Size.Height > Screen.PrimaryScreen.WorkingArea.Height)
        {
            Location = new Point(Location.X, 0);
            Size = new Size(Size.Width, Screen.PrimaryScreen.WorkingArea.Height);
        }
    }
4

2 回答 2

4

如果表单不处于正常状态,则不应保存表单的Locationor :Size

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
  if (this.WindowState == FormWindowState.Normal) {
    Settings.Default.WindowLocation = Location;
    Settings.Default.WindowSize = Size;
  }
  Settings.Default.WindowState = WindowState;
  Settings.Default.Save();
}

您的还原窗口例程没有完全意义。如果要使表格居中,为什么要保存位置?以最小化模式启动程序可能是不可取的,在这种情况下,我会将其默认为Normal

private void RestoreWindow()
{
  this.Location = Settings.Default.WindowLocation;
  this.Size = Settings.Default.WindowSize;

  // check for size or location off-screen, etc.

  if ((FormWindowState)Settings.Default.WindowState == FormWindowState.Minimized)
    this.WindowState = FormWindowState.Normal;
  else
    this.WindowState = Settings.Default.WindowState;
}

如果您需要恢复窗口的最后正常位置,则可以使用OnResizeEnd覆盖来保存设置:

protected override void OnResizeEnd(EventArgs e) {
  if (this.WindowState == FormWindowState.Normal) {
    Properties.Settings.Default.Location = this.Location;
    Properties.Settings.Default.Size = this.Size;
  }
  base.OnResizeEnd(e);
}

那么你的闭幕式就是:

protected override void OnFormClosing(FormClosingEventArgs e) {
  Properties.Settings.Default.WindowState = this.WindowState;
  Properties.Settings.Default.Save();
  base.OnFormClosing(e);
}
于 2012-05-21T16:01:44.170 回答
1

仅当 Form.WindowState 属性与 FormWindowState.Minimized 不同时,将窗体的大小和位置分别存储在 Form.Resize 事件处理程序和 Form.Move 事件处理程序中的局部变量中。然后将大小和位置变量的内容保存在设置中,在 FormClosing 事件处理程序中。

于 2012-05-21T16:07:25.403 回答