0

所以我查看了现有的用标记的答案,但没有找到我要找的东西(当我输入这个时,它也没有出现在类似问题区域中)。 对于初学者,请注意我不是在询问保存和恢复整个工作区。

所以这里是场景。我有一个根据用户请求添加的图形窗口(我们将其称为“时间轴”)。添加后,它会自动停靠在主窗体的最底部区域。然后,用户将时间轴窗口重新停靠在其他地方(可以停靠到边缘或另一个停靠窗格中)并更改其停靠行为(浮动、自动隐藏、选项卡等)。

Visual Studio 中有一个可演示的示例。如果您在右侧停靠窗格中的选项卡上有解决方案资源管理器并关闭解决方案资源管理器,您可以转到查看 -> 解决方案资源管理器并再次将其恢复,它会恢复到正确的位置。

现在用户通过点击其窗格上的[x]完全关闭时间轴窗口,并且在将来,他们请求再次将其添加到应用程序中。我想把它带回到最后一个停靠状态,并定位它上次关闭时的位置。

现在,我似乎能够通过ContentRemoved事件捕捉到窗格的关闭,但是在那里e.Content.DockHandler.Pane, e.Content.DockHandler.PanelPane并且e.Content.DockHandler.FloatPane都是null这样,所以我没有明显的方法来获取以前的停靠几何。 e.Content.DockHandler.DockPanel是有效的,但它是父/根对接面板,调用SaveAsXml(...)对我没有任何作用,因为它会获得整个工作区。

即使我能够在这里捕捉到它,我需要的信息。但是,我似乎也无法简单地调用LoadFromXml(...)任何东西。

DockContent如果我在将对象添加到之前尝试这样做,则DockPanel成员DockHandler.DockPanel为空,所以我似乎没有地方可以将 XML 恢复到,即使我能够得到它。

似乎没有其他活动DockPanel可以帮助我。

那么-有没有办法做到这一点,正确的方法是什么?我想确保我不会在关闭时尝试将停靠信息捕获为 XML 并在稍后恢复它时发出错误的树。

我曾考虑过不实际关闭窗口而只是取消停靠并隐藏它的想法,但还没有探索那么远。与挂钩DockChanged事件相同,但它似乎不会在DockContent停靠/浮动/等的对象上触发。我不知道为什么。

此外,该解决方案需要足够强大,以便我可以正确处理诸如最后一个停靠父级不再存在的情况。例如,如果它作为选项卡停靠在某处,但现在该父窗口(包含选项卡)也已关闭。我不知道LoadFromXml,假设它是否是正确的方法,是否足够强大以处理这种情况,因为我还没有能够测试它。

4

1 回答 1

0

如果我理解这个问题,我所做的是捕获 Closing 或 FormClosing 事件,.Hide() 表单并设置 e.Cancel = true。如果您使用的是 DockContent,那么有一个 HideOnClose() 可以为您完成工作。然后,当您想“重新打开”窗口时,只需使用一个空的 .Show(),它就会显示在您“关闭”它时的位置。至于如果最后一个对接父级不再存在则保存,我同意 Lex Li 的观点,这将需要破解。

于 2015-11-04T22:30:27.507 回答