首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Windows窗体应用程序设置中记录窗口位置

如何在Windows窗体应用程序设置中记录窗口位置
EN

Stack Overflow用户
提问于 2008-09-19 21:49:40
回答 8查看 20.5K关注 0票数 24

这似乎是一个标准要求:下次用户启动应用程序时,打开窗口的位置和状态与以前一样。这是我的愿望清单:

  • 窗口位置与相同
    • 除非屏幕已经调整大小,旧位置现在已关闭屏幕。

  • 分裂者应保留其地位。
  • 选项卡容器应该保留它们的选择
  • 一些下拉列表应该保留他们的选择。
  • 窗口状态(最大化、最小化、正常)与以前相同。
    • 也许你不应该开始最小化,我还没决定。

我将添加我目前的解决方案作为一个答案和限制。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-09-19 22:01:33

我的另一个选择是围绕应用程序设置编写更多自定义代码,并在formLoad和formClosed上执行。这不使用数据绑定。

缺点:

  • 更多要写的代码。
  • 非常谨慎。您在formLoad上设置属性的顺序令人困惑。例如,在设置拆分器距离之前,必须确保设置了窗口大小。

现在,这是我最喜欢的解决方案,但似乎工作量太大了。为了减少工作量,我创建了一个WindowSettings类,它将窗口位置、大小、状态和任何拆分器位置序列化为单个应用程序设置。然后,我可以为我的应用程序中的每个表单创建一个该类型的设置,在关闭时保存,并在加载时恢复。

我发布了源代码,包括WindowSettings类和一些使用它的表单。有关将其添加到项目的说明包含在WindowSettings.cs文件中。最棘手的部分是弄清楚如何添加具有自定义类型的应用程序设置。你选择浏览..。从类型下拉列表中,然后手动输入名称空间和类名。项目中的类型不会出现在列表中。

更新:我添加了一些静态方法来简化添加到每个表单中的样板代码。完成了向项目添加WindowSettings类和创建应用程序设置的说明之后,下面是一个代码示例,该代码必须添加到要记录和还原的每个表单中。

代码语言:javascript
运行
复制
    private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        Settings.Default.CustomWindowSettings = WindowSettings.Record(
            Settings.Default.CustomWindowSettings,
            this, 
            splitContainer1);
    }

    private void MyForm_Load(object sender, EventArgs e)
    {
        WindowSettings.Restore(
            Settings.Default.CustomWindowSettings, 
            this, 
            splitContainer1);
    }
票数 18
EN

Stack Overflow用户

发布于 2008-09-20 13:58:36

下面的示例显示了我是如何做到的。

  • 当关闭表单并保存表单的大小时,会调用SavePreferences,并设置一个标志,指示它是否已最大化(在此版本中,如果最小化,则不保存--下次它将恢复或最大化)。
  • LoadPreferences是从OnLoad调用的。
  • 首先,保存设计时的WindowState并将其设置为正常。只有当窗体大小是正常的WindowState时,才能成功地设置窗体大小。
  • 接下来,从持久化设置恢复大小。
  • 现在,确保表单适合您的屏幕(调用FitToScreen)。自上次运行应用程序以来,屏幕分辨率可能发生了变化。
  • 最后,将WindowState设置为最大化(如果是这样持久化的话),或者设置为先前保存的设计时值。

显然,这可以适应于持久化开始位置,以及关闭时是否最小化了表单--我不需要这样做。窗体上控件的其他设置(如拆分器位置和选项卡容器)非常简单。

代码语言:javascript
运行
复制
private void FitToScreen()
{
    if (this.Width > Screen.PrimaryScreen.WorkingArea.Width)
    {
        this.Width = Screen.PrimaryScreen.WorkingArea.Width;
    }
    if (this.Height > Screen.PrimaryScreen.WorkingArea.Height)
    {
        this.Height = Screen.PrimaryScreen.WorkingArea.Height;
    }
}   
private void LoadPreferences()
{
    // Called from Form.OnLoad

    // Remember the initial window state and set it to Normal before sizing the form
    FormWindowState initialWindowState = this.WindowState;
    this.WindowState = FormWindowState.Normal;
    this.Size = UserPreferencesManager.LoadSetting("_Size", this.Size);
    _currentFormSize = Size;
    // Fit to the current screen size in case the screen resolution
    // has changed since the size was last persisted.
    FitToScreen();
    bool isMaximized = UserPreferencesManager.LoadSetting("_Max", initialWindowState == FormWindowState.Maximized);
    WindowState = isMaximized ? FormWindowState.Maximized : FormWindowState.Normal;
}
private void SavePreferences()
{
    // Called from Form.OnClosed
    UserPreferencesManager.SaveSetting("_Size", _currentFormSize);
    UserPreferencesManager.SaveSetting("_Max", this.WindowState == FormWindowState.Maximized);
    ... save other settings
}

X

票数 6
EN

Stack Overflow用户

发布于 2008-09-19 21:54:27

我找到的最简单的解决方案是将数据绑定到应用程序设置中。我绑定窗口上的位置和clientSize属性以及拆分器上的splitterDistance。

缺点:

  • 如果您关闭窗口同时最小化,它将在下一次打开隐藏。把窗户拿回来真的很难。
  • 如果您关闭窗口时最大化,它打开填充整个屏幕,但不是最大化(小问题)。
  • 使用右上角或左下角调整窗口大小是很难看的。我猜这两个数据库的属性是互相争斗的。

如果你想尝试这种奇怪的行为,我用这种技术发布了一个样品溶液

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/105932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档