2014-09-02 72 views
1

我已經構建了一個類庫,它可以作爲一個GUI框架,可以被其他項目繼承。此應用程序基於項目WildGeminiMVVM應用程序沒有正確恢復狀態

我的問題是,在恢復阿瓦隆碼頭的佈局採用標準串行

var layoutSerializer = new XmlLayoutSerializer(manager); 

其中manager是類型DockingManager。經理恢復並清空標籤。我的猜測是Caliburn Micro無法找到存儲的ViewModel(名爲HomeViewModel)。不過,我正在努力證實這一點。

我相信我的引導程序是正確的,並且正在正確設置MEF容器以允許解析外部類型。我已經調試項目到一個點,我認爲這個問題正在發生,並在輸出窗口中,我可以看到Attach(Home)發生附件的位置(注意,「Home」是HomeViewModel的顯示名稱)。但是,我不知道附加過程出了什麼問題,因爲這是由MEF/Caliburn處理的。

我真的堅持調試此一想,如果

  1. 任何一個可以提供任何有見地的意見,如何與調試過程中進行?
  2. 任何人都願意看看解決方案?

我花了很多時間調試這個沒有任何運氣,這個問題足夠深奧和虛幻,以至於使大多數帖子在這裏與我無關。

謝謝你的時間。

+0

能重現這一問題的工作樣本,將不勝感激。 – pushpraj 2014-09-03 07:10:34

+0

嗨@pushpraj,非常感謝您的回覆。這一個正在殺死我!這是一個鏈接到項目http://1drv.ms/1A4v40R的GUI部分。它不是最小的,因爲我也包含了包文件夾。如果你能幫助我,我會願意代表你。另外,一旦你下載了這個,你可以讓我知道,所以我可以鎖定它。非常感謝...... – MoonKnight 2014-09-03 08:48:52

+0

如果您構建項目並運行它,您將看到「主頁」選項卡被打開。現在,默認情況下,所有'Documents'對象或更確切的'LayoutItemBase'對象的ShouldReopenOnStartup屬性都設置爲false。但是,如果關閉應用程序並打開「主頁」選項卡,則會創建「ApplicationState.bin」,您將看到「HomeViewModel」被寫入到已打開的文檔中。現在,當程序開始備份時,這些項目不應該被恢復,但它是。我的想法是MED/CaliburnMicro找不到這種類型... – MoonKnight 2014-09-03 09:03:22

回答

2

的討論和期待所提供的示例代碼後,我明白,下面

  • HomeViewModel或者可以說LayoutItemBase是不應該被重新爲ShouldReopenOnStartup如果關閉設置爲false
  • 應用程序,同時保留開放HomeViewModel文檔圖像恢復下次啓動時使用空白視圖[尚未確定]

分析

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; 
    } 
+0

非常感謝您看看這個。這是一個很好的妥協。我的混淆來自反序列化回調似乎不能正確取消的事實。此外,還不清楚在加載狀態操作期間空白的「IDocument」在哪裏被實例化;不應該忽略'ShouldReopenOnStartup'被忽略的事實,更重要的是爲什麼恢復的'HomeViewModel'是空白的。看來MEF無法解決這個'Export'。這個代碼是我從雙子座繼承下來的,在這個階段,我可能會重寫它的大部分內容是處理一個我還沒有問題的bug。 – MoonKnight 2014-09-04 09:05:47

+0

再次,非常感謝您的時間。我會在適當的時候給您獎勵您的時間(13小時@格林威治標準時間10:06)... – MoonKnight 2014-09-04 09:06:41

+0

我很高興能成爲您的協助,同時感謝您的謝意。我還想強調,它不是一個空白的IDocument,但它是一個碼頭管理器的'佈局元素',它將IDocument作爲內容託管。這個佈局元素通過'layoutSerializer.Serialize(stream)'存儲在應用程序狀態文件中,當你通過'layoutSerializer.Deserialize(stream)'反序列化狀態時,它也會恢復。其次,ShouldReopenOnStartup是來自gambit框架的「自定義屬性」,因此佈局管理器可能無法識別相同的內容。 – pushpraj 2014-09-04 13:21:17