Невозможно отобразить приложение WPF при ручной настройке MainWindow и создании приложения (MEF) - PullRequest
3 голосов
/ 15 июля 2010

У меня есть руки на 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 окна соответствующую импортированную модель представления.

Ответы [ 2 ]

1 голос
/ 30 июля 2010

Примеры приложений WPF Application Framework (WAF) показывают, как использовать MEF в приложении WPF.

0 голосов
/ 16 июля 2010

Наконец, я обнаружил, что импортирую свои пользовательские элементы управления WPF с помощью конструктора ImportAttribute по умолчанию, который фактически создает общий экземпляр класса, если во время экспорта не указана политика создания. И поскольку многие из моих элементов управления реализовывали один и тот же интерфейс, и я связывал их в своих представлениях, я на самом деле пытался добавить этот общий экземпляр пользовательского элемента управления в разные визуальные элементы, что не разрешено WPF (и, следовательно, исключением).

Я пометил свой импорт, используя для параметра RequiredCreationPolicy значение NonShared, и все вернулось в порядок! Это было все об изучении MEF ...

...