2010-05-13 32 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.