【问题标题】:Proper way to expose third party visual control in MEF在 MEF 中公开第三方视觉控制的正确方法
【发布时间】:2010-10-25 19:09:33
【问题描述】:

这样做的正确方法是什么? 假设我们的项目中有一些第三方库,我们需要提供对一些密封控件的访问权限。 将使用 MEF 创建新的小部件并将其添加到应用程序中,它们应该能够从核心应用程序导入一些控件。 那么如何正确导出这些控件呢?

【问题讨论】:

    标签: mvvm silverlight-4.0 mef


    【解决方案1】:

    如果您无法修改原始类(例如ThirdPartyComponent),那么您可以通过另一个类的属性进行导出(例如ThirdPartyComponentExporter):

    public class ThirdPartyComponentExporter
    {
       [Export(typeof(ThirdPartyComponent))]
       public ThirdPartyComponent Foo
       {
          get
          {
             return new ThirdPartyComponent();
          }
       }
    }
    

    对于可视化控件,您可能必须使用CreationPolicy.NonShared 来防止 MEF 在不同位置重用同一个实例。

    【讨论】:

    • 共享是默认的创建策略吗?我尝试了类似的方法并添加了我想在用户控件中导出的控件并通过属性公开它。然后我将该用户控件添加到主页(因为我想在可视化设计器中查看导出的控件,这是我设法做到的唯一方法)。看起来正在创建两个不同的可导出控件实例,一个由 MEF 创建,另一个是因为我在页面中添加了一个包含可导出控件的用户控件。
    • @Incognito:默认情况下,MEF 将尝试重用它自己创建的实例。但它不会重用 创建的实例,正如您在此处描述的那样。它不知道这些实例。
    • 您能否建议如何将导出的控件添加到 xaml 中的页面,而不是将其作为其他容器的子项添加到后面的代码中。我正在考虑类似 xaml 中控件的占位符之类的东西。我已经在其他帖子 stackoverflow.com/questions/4025197/… 中问过这个问题
    【解决方案2】:

    如何将第三方控件包装在“导出”类中,然后通过包装器访问该控件?

    【讨论】:

    • 这实际上是我现在正在做的。但是我失去了可混合性,因为我不能再在 Xaml 中添加导出的控件,所以这似乎不是正确的方法。我需要在任何地方共享控件的单个实例,所以现在即使它已经可以访问(例如在主页中),我也必须使用导入机制并将其添加到代码后面的某个容器中。
    猜你喜欢
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2017-09-25
    • 1970-01-01
    相关资源
    最近更新 更多