VisualStudio настроить операцию вставки для моего компонента во время разработки - PullRequest
0 голосов
/ 02 ноября 2018

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

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

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

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

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

1 Ответ

0 голосов
/ 02 ноября 2018

Вы можете переопределить метод 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 после вставки компонента.

...