2010-11-10 71 views
2

我已經使用MEF加載外部XAP,這很好。 但是,當我從帶有加載控件的頁面導航離開時,然後回到它,控件處於我離開它的確切狀態。重置使用MEF加載的控件

現在有時候這很棒,但不適合我工作的項目。

如何將控件重置爲初始狀態?

控制被加載(successfuly)插入此處:

<ItemsControl x:Name="content"/> 

這是XAML標記

我有一個在NavigatedFrom方法:

protected override void OnNavigatedFrom(NavigationEventArgs e) 
{ 
    content.Items.Clear(); 
} 

這successfuly除去控制,就像之前添加的那樣,當我回到頁面時,它崩潰告訴我,控制已經是一個元素的孩子。

這裏是全網頁代碼:

public partial class Wizard : IPartImportsSatisfiedNotification 
{ 
    public Wizard() 
    { 
     InitializeComponent(); 
     CompositionInitializer.SatisfyImports(this); 

     var controlToLoad = IsolatedStorageHelper.GetValue("control"); 

     if (!String.IsNullOrEmpty(controlToLoad)) 
     { 
      CatalogService.AddXap(controlToLoad + ".xap"); 
     } 
    else 
    { 
     NavigationService.Navigate(new Uri("/ServiceSelector", UriKind.Relative)); 
    } 
} 

protected override void OnNavigatedFrom(NavigationEventArgs e) 
{ 
    content.Items.Clear(); 
} 

[Import] 
public IDeploymentCatalogService CatalogService { get; set; } 

[ImportMany(AllowRecomposition = true)] 
public Lazy<UserControl>[] MefModuleList { get; set; } 

#region IPartImportsSatisfiedNotification Members 

public void OnImportsSatisfied() 
{ 
    MefModuleList.ToList() 
     .ForEach(module => 
      content.Items.Add(module.Value) 
     ); 
} 

#endregion 
} 

任何人任何想法?

感謝,

回答

1

一個簡單的解決方法是使用ExportFactory而不是懶惰,以避免整個問題:創建的,而不是重複使用舊的一個新的實例。只要確保丟棄的實例得到GC'd而不是堆積(編輯:新的實例交給你在ExportLifetimeContext實例,這將管理對象的壽命)。

現在有什麼問題聽起來像老小孩仍然認爲他有一個父母。在你再次將他添加回容器之前(最好是在你移除他的時候),你需要告訴他他現在已經無父母了。雖然UserControl.Parent是隻讀的。也許在父級上調用RemoveLogicalChild?我還沒有測試過,但如果ExportFactory caper不會讓你的船浮起來,那麼一般的大道似乎值得探索。

+0

你是否有這樣的例子,因爲我遵循上面的toturoial,並沒有很多機會閱讀MEF呢:( – JamesStuddart 2010-11-11 09:31:53

+0

ExportFactory模板的使用方式與Lazy完全相同。相同的參數:無論是導入的類型或導入的類型,然後是元數據類型爲了得到實例,而不是使用module.Value,你需要獲取module.CreateExport()。ExportFactory .CreateExport()返回ExportLifetimeContext ,它管理有問題的對象的生命週期。實際的T實例在它的Value屬性中。 – 2010-11-11 18:28:22