Расширение с помощью UserControls: как вернуть составную деталь в исходное состояние? - PullRequest
1 голос
/ 10 июля 2011

У меня есть хост-приложение WinForm, расширенное с помощью UserControls.Композиция и реализация прекрасно работают при первом запуске.Когда я закрываю пользовательский элемент управления, я хочу предположить, что он должен быть утилизирован.Однако это вызывает проблему, когда я хочу снова показать пользовательский элемент управления.

Что я хочу сделать, так это вернуть пользовательский элемент управления в его исходное состояние после того, как я убедился, что объект был удален из любых ресурсов.

Вот один из пользовательских расширений:

[ExportMetadata ( "ModuleName", "ContactManager" )]
[Export ( typeof ( IUserModule ) )]
partial class ucxContactManager : IUserModule
{
    #region Fields
    //  Fields

    readonly string moduleName = "ContactManager";
    readonly string moduleDescription = "Contact Manager Extension Module";

    //  called from ucxContactManager constructor
    void InitializeUserModule ( )
    {
        Closing += ( o, e ) => Dispose ( );
        uxCloseContactForm.Click += ( o, e ) => Closing ( this, null );
    }

    //  IUserModule Members
    public event EventHandler<EventArgs> Closing = delegate { };
}

CompositionController выполняет всю работу по обнаружению и составлению, предоставляя метод для запроса определенного модуля:

//  Lazily import all IUserModule interfaces
[ImportMany ( typeof ( IUserModule ), AllowRecomposition = true )]
public IEnumerable<Lazy<IUserModule, IQueryMetadata>> Modules { get; set; }

public bool TryGetModule ( string ModuleName, out IUserModule Module )
{
    var module = Modules.Where ( m => m.Metadata.ModuleName == ModuleName )
                        .Select ( m => m )
                        .FirstOrDefault ( );

    if (module != null)
    { Module = module.Value; }
    else
    { Module = null; }

    return Module != null;
}

Теперь, когда мы находим модуль, назначение module.Value вызывает инициализацию UserControl - вызывается конструктор.

Когда UserControl закрывается и удаляется, как я могу вернуть модуль в это начальное состояние?

1 Ответ

1 голос
/ 12 июля 2011

Я думаю, что ваша проблема в том, что вы устанавливаете Module в module.Value, поэтому вы создаете экземпляр фактического IUserModule через Lazy<IUserModule, IQueryMetadata> экземпляр.Если вам это не понадобится до тех пор, пока не установите вместо Module экземпляр Lazy<IUserModule, IQueryMetadata>, а затем создайте его, когда вам это нужно.

Другая вещь, которую вам, возможно, придется рассмотреть, это срок службы детали.Если вы не перекомпоновали свою коллекцию Modules, у вас будет только один экземпляр IUserModule, поскольку он создается и создается с помощью экземпляра Lazy<,>.Вместо этого вы можете рассмотреть возможность использования ExportFactory<IUserModule, IQueryMetadata> для ускорения нового экземпляра каждый раз.

ExportFactory не является частью .NET 4.0 (он сделан в Silverlight, но не полностью .NET4.0 BCL. Glenn Block выпустил его версию для .NET 4, которую вы можете получить здесь .

...