我创建了WinForm组件,我想在开发人员复制时替换组件的某些属性,然后在设计时从剪贴板粘贴(不是复制时而是粘贴时)组件。
VisualStudio创建新的组件副本并分配属性,因此它成为源组件的副本。
我需要根据所选组件替换粘贴操作中的某些属性。
它与带有控件组件的标准复制/粘贴操作非常相似。如果设计人员在粘贴控制之前选择了其他容器(如“面板”),则在更改组件父级时。
我认为执行它的代码应该在我的ComponentDesigner类中。 我探索了ComponentDesigner方法,但是找不到任何控制剪贴板操作的方法。
答案 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
按钮的下拉菜单中看到的文本。