У меня есть руки на MEF уже неделю, и я пытаюсь создать приложение WPF, которое загружает импортированные элементы управления из MEF.
Я создал проект приложения WPF и удалил окно по умолчанию и URI запуска приложения. Затем я обработал событие запуска приложения для составления приложения:
public partial class App : Application, IPartImportsSatisfiedNotification
{
{...}
private void App_Startup(object sender, StartupEventArgs e)
{
this.Compose();
}
public void Compose()
{
try
{
globalCatalog.Catalogs.Add(new DirectoryCatalog(extensionsDirectoryPath));
CompositionContainer container = new CompositionContainer(globalCatalog);
container.ComposeParts(this);
}
catch (Exception ex)
{
// Do something
}
}
{...}
}
На самом деле, когда отладка и просмотр объектов после импорта выполнены, все иерархически составлено нормально, как я и хотел. Но когда я пытаюсь показать MainWindow приложения, на MainWindow вызывается исключение. Вызов ():
"Указанный элемент уже является логическим дочерним элементом другого элемента. Сначала отключите его."
Хотя мой код в методе OnImportsSatisfied выглядит нормально, так как он работает, когда не используется механизм MEF:
public void OnImportsSatisfied()
{
Window mainWindow = new Window();
mainWindow.Content = this.importedControl;
this.MainWindow = mainWindow;
this.MainWindow.Show();
}
Я настаиваю на том, что это прекрасно работает, если не импортировать элементы управления с MEF. Что удивительно, так это то, что этот код тоже не работает:
Window mainWindow = new Window();
//mainWindow.Content = this.importedControl;
this.MainWindow = mainWindow;
this.MainWindow.Show();
Так что я подозреваю, что ComposeParts делает немного больше, чем говорит, поскольку это единственный член, действующий на моем реальном экземпляре приложения.
Надеюсь, кто-нибудь может мне помочь (Гленн?).
Благодаря.
Edit:
Я обнаружил, что когда я удаляю интерфейс IPartImportsSatisfiedNotification из моих частей, не генерируется исключение, и появляется окно. Но, конечно, окно пустое, так как мне нужен этот метод OnImportsSatisfied, чтобы установить для DataContext окна соответствующую импортированную модель представления.