如何使用类似添加的体系结构扩展WPF应用程序?

时间:2010-05-13 18:46:44

标签: c# .net wpf xaml add-in

假设我有一个WPF应用程序,它显示一个带有ArrayList的ListBox,其中包含任意类型的对象 - 作为源,并且此应用程序托管在程序集“A”中。默认情况下,ListBox将显示自定义对象'ToString'方法的返回值。如果找到该对象类型的数据模板,则ListBox将使用它进行渲染。  想象一下,另一个组件'B'引用'A'并试图通过为某些类型提供自定义数据模板来扩展它,以便在该ListBox中使用。如果没有'A'意识到B,有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

看看Composite Application Guidance。它应该适合你。

答案 1 :(得分:1)

是的,这是WPF的一种常见用法。

在你的装配B中:

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

    [assembly:ThemeInfo(ResourceDictionaryLocation.None,ResourceDictionaryLocation.SourceAssembly)]

  4. 现在你的装配A:

    1. 创建用于浏览到程序集B的UI(或以其他方式选择.dll文件)
    2. 当用户选择要使用的装配B时,使用var assembly = Assembly.LoadFile(path)加载
    3. 使用Activator.CreateInstance(assembly.GetType(typeName))在程序集B中创建一个只知道其名称
    4. 的对象
    5. 将此对象添加到UI,或使用在其上定义的界面创建其他对象(界面本身在程序集A中定义)并将其添加到UI
    6. 程序集B中定义的模板将用于显示程序集B中的控件和数据,即使程序集A对程序集B一无所知。