我目前正在开发一个项目,目的是开发一个类似VS的IDE,用户可以将新控件放到/删除到设计图面,并修改这些控件的属性。
所以我实现了IDesignerHost, IServiceContainer, IContainer, IComponentChangeService,
和其他一些有用的界面,用来设计它。
一切正常,我的工具箱,设计界面和我的propertyGrid
工作得很好。
附加到drag'n'droped控件是一个标签,必须跟随控件,而用户用鼠标移动。
我尝试使用控件的LocationChanged event
,在控件移动时移动标签。但是这个事件只发生一次,在控件移动后,所以当控件移动时标签不会移动。
我无法找到让这项工作的方法。请问有什么好主意吗?
谢谢
修改: 我使用自定义类,实现IDesignerHost。此设计图面上的控件不会触发事件鼠标-----(例如:MouseDown,MouseMove)。
答案 0 :(得分:1)
我终于找到了如何做到这一点:
我实施了ISelectionService
,在SetSelectedComponents
函数中,我设法选择了与所选控件相关联的标签控件。
我覆盖了标签的设计者,因此在选择标签时不会显示边框/调整大小矩形。
这是一个不太优雅的解决方案,但效果很好=)。
答案 1 :(得分:1)
每个Control都有ControlDesigner,提供了其他方法来支持在设计时扩展和更改关联控件的行为。
在ControlDesigner中,您有一个BehaviorService,它负责控制控件的DesignSurface行为。
BehaviorService有多个Glyph和Adorner,就像控件的UI装饰器一样。控件重新调整大小的橡皮筋像矩形是一个字形,称为System.Windows.Forms.Design.Behavior.SelectionBorderGlyph一个私有类到.Net 2.0。
此链接可能有所帮助:
http://msdn.microsoft.com/en-us/library/ms171820.aspx
http://msdn.microsoft.com/en-us/library/bb514670%28VS.90%29.aspx
您应该能够添加自定义的Glyph,其中标签附有Control。
HTH
答案 2 :(得分:0)
Form2包含panel1, label1
panel1.MouseMove += panel1_MouseMove
panel1.MouseDown += panel1_MouseDown
单击MouseDown+Left Button
时的 - >保存初始鼠标位置
点击MouseMove+Left Button
时 - >通过当前鼠标位置和保存的初始位置之间的差异来移动(panel1 + label1)。
已经完成了。
public partial class Form2 : Form
{
private int _x, _y;
public Form2()
{
InitializeComponent();
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
panel1.Location = new Point(panel1.Location.X + (e.X - _x), panel1.Location.Y + (e.Y - _y));
label1.Location = new Point(label1.Location.X + (e.X - _x), label1.Location.Y + (e.Y - _y));
}
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
_x = e.X;
_y = e.Y;
}
}
}