VisualStudio在设计时为我的组件自定义粘贴操作

时间:2018-11-02 20:18:58

标签: visual-studio winforms custom-component design-time system.componentmodel

我创建了WinForm组件,我想在开发人员复制时替换组件的某些属性,然后在设计时从剪贴板粘贴(不是复制时而是粘贴时)组件。

VisualStudio创建新的组件副本并分配属性,因此它成为源组件的副本。

我需要根据所选组件替换粘贴操作中的某些属性。

它与带有控件组件的标准复制/粘贴操作非常相似。如果设计人员在粘贴控制之前选择了其他容器(如“面板”),则在更改组件父级时。

我认为执行它的代码应该在我的ComponentDesigner类中。 我探索了ComponentDesigner方法,但是找不到任何控制剪贴板操作的方法。

1 个答案:

答案 0 :(得分:0)

您可以覆盖组件的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");
        }
    }
}

但是事务描述可能已本地化,因为它是粘贴组件后在Visual Studio工具栏上的Undo按钮的下拉菜单中看到的文本。