Public Overloads Property MainWindow() As Window
Get
Return MyBase.MainWindow
End Get
Set(ByVal value As Window)
MyBase.MainWindow = value
End Set
End Property
在VB中则更为详细。应用程序框架会绕开主窗口的属性,自动对指定窗口进行实例化操作。禁用应用程序框架并往Application.xaml.vb文件中添加一个Sub Main:
'''
'''Application Entry Point.
'''
_
Public Shared Sub Main()
Dim app As Application = New Application
app.Run()
End Sub
这会导致应用程序通过所有物检索主窗口以至于在主窗口中评估MEF请求。主窗口将自己输出到MEF以匹配MainWindow所有物的输入:
_
Partial Public Class Main
主窗口使用MEF来发掘可获取的执行IExtension接口的扩展:
_
Private exportExtensions As ExportCollection( _
Of IExtension)
任何出现在目录或人为添加到容器以及执行了IExtension接口的数据都会出现在集合中。注意这会创建Export对象的集合,该集合 包含足够的信息使扩展实例化,但是它们还没有将其实例化。对于保存性能来说这显得尤为重要。主窗口会用标准WPF代码填充菜单:
Private Sub Main_Loaded() Handles Me.Loaded
For Each export In exportExtensions
Dim newItem = New MenuItem()
newItem.Header = export.Metadata("MenuCaption")
Me.ExtensionMenu.Items.Add(newItem)
Next
End Sub
注意菜单标题取自MEF元数据。虽然这样有效,但是你的目标是要让编写扩展变得更简单。该元数据方法要求程序员懂得使用确切字符串“MenuCaption”的方法。使用强类型MEF元数据可以解决这一问题。首先,创建一个接口: