Как расширить приложение WPF с помощью подобной надстройке архитектуры? - PullRequest
2 голосов
/ 13 мая 2010

Допустим, у меня есть приложение WPF, которое показывает ListBox с ArrayList, заполненным объектами произвольных типов, в качестве источника, и это приложение размещено в сборке 'A'. По умолчанию ListBox отображает возвращаемое значение метода пользовательского объекта «ToString». Если шаблон данных для этого типа объекта найден, ListBox будет использовать его для рендеринга. Представьте, что есть еще одна сборка «B», которая ссылается на «A» и пытается расширить ее, предоставляя пользовательские шаблоны данных для определенных типов, которые будут использоваться в этом ListBox. Есть ли какой-нибудь способ сделать это, не зная, что «А» знает о Б?

Ответы [ 2 ]

2 голосов
/ 13 мая 2010

Взгляните на Руководство по составным приложениям . Это должно работать для вас.

1 голос
/ 13 мая 2010

Да, это очень распространенное использование WPF.

В вашей сборке B:

  1. Создайте папку Темы, содержащую файл с именем Generic.xaml, содержащий пустой тег <ResourceDictionary>
  2. Внутри тега <ResourceDictionary> добавьте DataTemplates и ControlTemplates для типов в B
  3. В файле AssemblyInfo.cs добавьте следующую строку:

    [сборка: ThemeInfo (ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]

Сейчас в вашей сборке A:

  1. Создать пользовательский интерфейс для просмотра сборки B (или иным образом выбрать файл .dll)
  2. Когда пользователь выбирает сборку B для использования, для загрузки используйте var assembly = Assembly.LoadFile(path)
  3. Используйте Activator.CreateInstance(assembly.GetType(typeName)), чтобы создать объект в сборке B, зная только его имя
  4. Добавьте этот объект в ваш пользовательский интерфейс или создайте другие объекты, используя определенный для него интерфейс (сам интерфейс определен в сборке A), и добавьте его в свой пользовательский интерфейс

Шаблоны, определенные в сборке B, будут использоваться для представления элементов управления и данных в сборке B, даже если сборка A ничего не знает о сборке B.

...