用MEF技术在WPF应用程序中加载控件的分离组件

4

我有一些UI应用程序扩展,它们在单独的dll文件中,并通过MEF进行连接。我的问题是,如果它们有一个对话框(WPF用户控件),我是否应该将对话框作为扩展的属性,如下所示:

public UserControl ExtDialog { get; set; }

还是应该使用打包 URI 加载它们吗?
public string ExtDialogUri { get; set; }

我正在学习包URI,但不确定它是否真正有效。哪种方法是更“推荐”的方法?

注意:这些对话框将使用NavigationService.Navigate()方法进行导航。

1个回答

4
我不会使用这两种选项。问题在于,无论何时创建对话框,这两种方法都缺乏时间上的灵活性。如果使用第一种方法,则对话框将始终被创建,无论是否需要。使用包装URL的问题在于扩展程序无法控制如何创建对话框的实例。如果控件需要在创建后初始化(需要创建视图模型等),该怎么办?
我认为,更好的做法是公开一个工厂来创建对话框:
public IExtDialogFactory ExtDialogFactory { get; set; }

public interface IExtDialogFactory
{
    UserControl CreateDialog(); 
}

我可以把这个属性设为Lazy<T>,这样它会在需要时才被创建。这个怎么样? - Rick Rat
我想我应该提一下,这个对话框将通过导航框架进行导航。 - Rick Rat
是的,Lazy<T>会有所帮助,但扩展仍然无法控制对话框的创建方式。这对我来说是最大的限制。虽然我没有使用过任何导航框架,但也许那是解决问题的方法。 - Pavlo Glazkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接