【问题标题】:Form.visible must be true to read .left and .top?Form.visible 必须为 true 才能读取 .left 和 .top?
【发布时间】:2009-07-07 19:38:25
【问题描述】:

我创建了一堆表单,我想在应用程序关闭/启动时保存并恢复它们的位置。

但是,如果表单不可见,则 .top.left 都是 0。只有当它可见时,这些属性才会填充它们的“真实”值。

现在我的任务是显示每个表单,保存信息,然后将其返回到之前的可见状态:

        int i;
        bool formVisible;

        // Show all current forms and form positions in array frmTestPanels
        i = 0;
        while (frmTestPanels[i] != null)
        {
            formVisible = frmTestPanels[i].Visible;
            frmTestPanels[i].Visible = true;
            note(frmTestPanels[i].Text + "(" + frmTestPanels[i].Left.ToString() + ", " + frmTestPanels[i].Top.ToString() + ") visible: " + formVisible.ToString());
            frmTestPanels[i].Visible = formVisible;
            i++;
        }
        note(i.ToString() + " forms present");

note() 是一个简单的函数,只显示信息。

当然,这会导致所有不可见的表单在关机时闪烁(也可能在启动时?还没有到那一步……),这是不可取的。

  • 当表单不可见时,还有其他方法可以获取表单的顶部和左侧吗?
  • 或者,有没有更好的方法来保存和恢复表单状态?

【问题讨论】:

    标签: c# winforms forms


    【解决方案1】:

    您将需要捕获窗体上的 Closing 和 Minimizing 事件,并及时存储该位置的位置。

    当表单被隐藏或最小化时,这些字段无效。

    【讨论】:

    • 所以如果我将表单创建为隐藏表单,那么在某些时候我必须显示它才能获取或设置坐标?
    • 是的。但是在用户第一次看到表单时接受默认位置可能是合乎逻辑的,并且只有在表单显示给用户然后关闭(或最小化)时才保留坐标。
    【解决方案2】:

    每当用户关闭/隐藏/关闭/使不可见/无论什么形式时,保存其位置。 在这个时间点。如果用户要删除一个表单,它肯定已经在屏幕上,您不必担心它不可见。

    另一方面,在用户第一次请求之前不要创建表单。创建每个表单时,读取其存储位置并进行相应设置。

    使用此方案,如果表单从未向用户显示,则其位置将永远不会被恢复或保存。

    【讨论】:

    • 对于这个特定的应用程序,一次创建它们很方便,并且可以节省以后访问数据库的时间。此外,用户在请求表单时会感知到即时响应。一般来说,等待的表格不多(5-20​​),所以它不是一个巨大的资源消耗。所以我不希望根据要求创建它们。但听起来好像我将不得不在另一个数据结构中跟踪它们的位置。
    【解决方案3】:

    当用户关闭表单而不是应用程序关闭时保存表单位置怎么样?

    【讨论】:

    • 用户永远不会关闭表单——这些表单是在应用程序的生命周期内创建并持续存在的。当用户“关闭”一个表单时,它只是将 visible 属性设置为 false。在某些情况下,表单永远不会显示 - 只有在用户请求时才会显示。
    • 你仍然可以在FormClosing事件中保存位置,即使不是用户关闭它...
    • 所以如果form.visible=false,当表单关闭时我可以读取.top 和.left 吗?即使是这种情况,我有时也会希望在不关闭表单的情况下保存表单状态。
    【解决方案4】:

    您不能将事件处理程序附加到每个表单的Move 事件并在它们移动时跟踪它们的位置吗?它们的位置只有在它们可见时才会改变,但这样你会在它们移动时得到通知。然后您可以在关机时将每个表单位置的本地缓存转储到磁盘。

    虽然我对表单创建没有合适的想法,但我认为可以将它们显示在指定的初始位置。毕竟有一个Form.StartupPosition 属性。和Form.Location。根据文档,这应该可以工作。

    【讨论】:

    • 单独跟踪这些信息是一种选择,但我希望避免单独处理这些数据。
    【解决方案5】:

    如果用户从未见过该表单,那么 Top 和 Left 就不是真正适用的,是吗?由于它们与视觉位置有关,并且没有视觉位置......

    一旦用户至少看到了一次表单,您可以在再次隐藏之前将 Top 和 Left 捕获到局部变量中,并在释放表单时使用这些局部变量来存储位置。然后你就有了下一次表单可见时的初始位置。

    【讨论】:

      猜你喜欢
      • 2014-07-13
      • 2021-09-13
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多