【问题标题】:Resetting a Control loaded using MEF重置使用 MEF 加载的控件
【发布时间】:2010-11-10 17:11:59
【问题描述】:

我已经使用 MEF 加载外部 XAP,效果很好。 但是,当我离开加载了控件的页面,然后返回到该页面时,该控件处于我离开它的确切状态。

现在有时这很好,但不适用于我正在从事的项目。

如何将控件重置为其初始状态?

控件被加载(成功)到这里:

 <ItemsControl x:Name="content"/>

这是在 XAML 标记中

我有一个 On NavigatedFrom 方法:

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

这成功删除了控件,就像在添加之前一样,当我返回页面时它崩溃了,告诉我控件已经是元素的子元素。

这是完整的页面代码:

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
}

有人有什么想法吗?

谢谢,

【问题讨论】:

    标签: c# silverlight-4.0 mef


    【解决方案1】:

    一个简单的解决方法是通过使用 ExportFactory 而不是 Lazy 来避免整个问题:创建一个新实例而不是重用旧实例。只需确保丢弃的实例得到 GC 而不是堆积起来(编辑:新实例在 ExportLifetimeContext 实例中交给你,它管理对象的生命周期)。

    现在出了什么问题,听起来那个大孩子仍然认为他有父母。在你再次将他添加回容器之前(最好是在你移除他的时候),你需要告诉他他现在没有父母了。不过,UserControl.Parent 是只读的。也许在父级上调用 RemoveLogicalChild?我还没有测试过,但一般途径似乎值得探索,如果 ExportFactory 雀跃不漂浮你的船。

    【讨论】:

    • 你有这方面的例子吗,因为我按照上面的教程,还没有太多机会阅读 MEF :(
    • ExportFactory 模板的使用方式与 Lazy 完全相同。相同的参数:要么只是导入的类型,要么是导入的类型后跟元数据类型。要从中获取实例,而不是使用 module.Value,您可以使用 module.CreateExport()。 ExportFactory.CreateExport() 返回 ExportLifetimeContext,它管理相关对象的生命周期。实际的 T 实例位于其 Value 属性中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多