VisualStudio настраивает операцию вставки для моего компонента во время разработки

Я создал компонент WinForm и хочу заменить некоторые свойства моего компонента, когда разработчик копирует, а затем вставляет (не при копировании, а при вставке) компонент из буфера обмена во время разработки.

VisualStudio создает новую копию компонента и назначает свойства, чтобы он стал копией исходного компонента.

Мне нужно заменить некоторые свойства при операции вставки в зависимости от выбранного компонента.

Это очень похоже на стандартную операцию копирования/вставки с компонентом управления. Когда дизайнер меняет родительский элемент компонента, если разработчик выбирает другой контейнер (например, панель) перед вставкой элемента управления.

Я думаю, что код для его выполнения должен быть где-то в моем классе ComponentDesigner. Я изучил методы ComponentDesigner, но не могу найти методы, управляющие операциями с буфером обмена.


person DmitryB    schedule 02.11.2018    source источник
comment
Component — довольно простой класс. Если вы хотите что-то, чего в нем нет, вам нужно добавить это самостоятельно. См.: Пользовательский элемент управления, полученный из события Component — OnCreate ?. Это старый пример, все еще в Документах. Вам просто нужна часть создания события: Реализовать компонент, поддерживающий асинхронный шаблон на основе событий.   -  person Jimi    schedule 03.11.2018


Ответы (1)


Вы можете переопределить метод OnParentChanged вашего компонента, который выполняется, когда компонент вставляется в форму. Затем проверьте свойство DesignMode, чтобы убедиться, что вы находитесь в режиме разработки:

public class MyComponent : Label
{
    protected override void OnParentChanged(EventArgs e)
    {
        if (DesignMode) {
            // Change properties as desired.
            Text = "Design";
        }
        base.OnParentChanged(e);
    }
}

Когда компонент удаляется из панели инструментов, этот код не выполняется. (Не могу объяснить почему, но это именно то, что нам нужно.)


Если вы получили свой компонент от System.ComponentModel.Component, вы можете переопределить свойство Site; однако для этого потребуется дополнительная логика, чтобы проверить, был ли вставлен компонент.

public override ISite Site
{
    get {
        return base.Site;
    }

    set {
        base.Site = value;
        if (value?.Container is IDesignerHost dh &&
            dh.TransactionDescription == "Paste components") {

            MessageBox.Show("Pasted");
        }
    }
}

Но, вероятно, описание транзакции локализовано, потому что это текст, который вы видите в раскрывающемся списке кнопки Undo на панели инструментов Visual Studio после вставки компонента.

person Olivier Jacot-Descombes    schedule 02.11.2018
comment
К сожалению, в моем случае это не сработает. OnParentChanged находится под контролем. Мой компонент унаследован от System.ComponentModel.Component. - person DmitryB; 02.11.2018