gpt4 book ai didi

wpf - MVVM应用程序无法正确还原状态

转载 作者:行者123 更新时间:2023-12-03 10:28:16 27 4
gpt4 key购买 nike

我建立了一个类库,该类库充当可被其他项目继承的GUI框架。此应用程序基于项目WildGemini

我的问题是,使用标准序列化程序恢复Avalon Dock的布局后

var layoutSerializer = new XmlLayoutSerializer(manager);

其中 managerDockingManager类型。管理器将还原并清空标签。我的猜测是Caliburn Micro无法找到存储的ViewModel(名为 HomeViewModel)。但是,我正在努力确认这一点。

我相信我的 bootstrap 是正确的,并且正确设置了MEF容器以允许解析外部类型。我已经将项目调试到我认为会发生此问题的地步,并且在输出窗口中,我可以看到正在发生附件的 Attach(Home)(请注意,“Home”是 HomeViewModel的显示名称)。但是,我不知道附加过程有什么问题,因为这是由MEF/Caliburn处理的。

我真的很想调试这个,想知道是否
  • 任何人都可以就如何进行调试过程提供任何有见地的建议?
  • 任何人都愿意看一下解决方案吗?

  • 我花了很多时间来调试它,但是没有运气,这个问题深奥而虚幻,以至于使这里的大多数帖子与我无关。

    谢谢你的时间。

    最佳答案

    经过讨论并查看了提供的示例代码后,我了解到以下内容

  • HomeViewModel或可以说LayoutItemBase不应该重新打开,因为ShouldReopenOnStartup设置为false
  • 如果您在为HomeViewModel打开文档的同时关闭应用程序,则会在下一次以空白 View 启动时还原[不正确]

  • 分析
    SaveState方法正确遵守了 ShouldReopenOnStartup的值,并且未发出 HomeViewModel的状态,但是停靠管理器仍在为文档发出元素。

    因此,在下一次重启时, LoadState找不到任何存储状态,但是创建了一个窗口,因为停靠管理器的布局状态中存在一个元素
      <LayoutDocument Title="HomePP" IsSelected="True" IsLastFocusedDocument="True" ContentId="d716f824-cfff-4b54-8fd6-2d026a99369a" .../>

    您确实尝试过使用序列化回调的e.Cancel属性来取消事件,但是似乎不应该阻止加载窗口,而只是在不需要时取消事件。

    分辨率

    因此,理想的方法是在保存布局之前关闭不应该还原的文档

    这是我做的
    ShellViewmodel.cs : Line 279方法 SaveState(string)
    更改以下代码
        if (!item.ShouldReopenOnStartup)
    continue;


        if (!item.ShouldReopenOnStartup)
    {
    //this item is not supposed to be restored so close the window before saving layout
    IDocument doc = item as IDocument;
    if (doc != null)
    CloseDocument(doc);
    continue;
    }

    关于wpf - MVVM应用程序无法正确还原状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25633160/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com