0

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

VisualStudio 创建组件的新副本并分配属性,使其成为源组件的副本。

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

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

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

4

1 回答 1

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");
        }
    }
}

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

于 2018-11-02T20:34:58.220 回答