2010-05-13 52 views
2

比方说,我有一个WPF应用程序,它显示一个带有ArrayList的ListBox - 用任意类型的对象进行填充 - 作为源,并且此应用程序托管在程序集“A”中。默认情况下,ListBox将显示自定义对象的'ToString'方法的返回值。如果找到该对象类型的数据模板,那么ListBox将使用它来进行渲染。 想象一下,另一个程序集'B'引用了'A',并试图通过为某些类型提供定制数据模板来扩展它,以便在该列表框中使用。如果没有'A'知道B,有没有办法做到这一点?如何使用插件类构架来扩展WPF应用程序?

回答

1

是的,这是WPF的一个非常常见的用法。

在汇编B:

  1. 创建主题文件夹包含一个名为Generic.xaml文件,其中包含一个空<ResourceDictionary>标签
  2. <ResourceDictionary>标签内,B中
  3. 添加的DataTemplates和CONTROLTEMPLATES的类型
  4. 在您的AssemblyInfo.cs文件中,添加以下行:

    [assembly:ThemeInfo(ResourceDictionaryLocation.None,ResourceDictionaryLocation.SourceAsse mbly)]

现在,在您组件A:

  1. 创建UI浏览到组件B(或以其他方式选择的.dll文件)
  2. 当用户选择的组件B至使用,使用var assembly = Assembly.LoadFile(path)加载它
  3. 使用Activator.CreateInstance(assembly.GetType(typeName))创造集B的对象只知道它的名字
  4. 这个对象添加到您的UI,或者创建使用定义的接口的其他对象(接口本身在组件A中定义)并添加到您的UI中

在程序集B中定义的模板将用于呈现程序集B中的控件和数据,即使程序集A不知道组装B.