0

情况 :

我目前正在开发一个项目,其目标是开发一个类似 VS 的 IDE,用户可以在其中将新控件拖放到设计表面,并修改这些控件的属性。

所以我实现IDesignerHost, IServiceContainer, IContainer, IComponentChangeService,了和其他一些有用的界面,专门设计的。

一切正常,我有我的工具箱,我的设计界面,我的propertyGrid工作也很好。

问题是:

附加到拖放控件的是一个标签,当用户用鼠标移动它时,它必须跟随控件

我尝试使用LocationChanged event控件的,在控件移动时移动标签。但是这个事件只发生一次,在控件移动之后,标签在控件移动时不会移动。

我无法找到一种方法来完成这项工作。请问有人有什么好主意吗?

谢谢

编辑: 我使用自定义类,实现 IDesignerHost。此设计图面上的控件不会触发事件 Mouse-----(例如:MouseDown、MouseMove)。

4

3 回答 3

1

我终于找到了方法:

我实现ISelectionService并在SetSelectedComponents函数中,我设法选择与任何选定控件关联的标签控件。

我覆盖了标签的设计师,因此在选择标签时不会显示边框/调整大小矩形。

这是一个不太优雅的解决方案,但效果很好 =)。

于 2009-09-12T15:31:38.620 回答
1

每个 Control 都有一个ControlDesigner,提供额外的方法来支持在设计时扩展和更改关联 Control 的行为。

在 ControlDesigner 中,您有一个BehaviorService,它负责控制控件的 DesignSurface 行为。

BehaviorService 有多个GlyphAdorner,它们就像控件的 UI 装饰器。像矩形一样重新调整橡皮筋大小的控件是一个 Glyph,称为 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

您应该能够添加您的自定义字形,该字形带有与控件附加的标签。

高温高压

于 2010-07-23T06:46:36.403 回答
0

Form2 包含一个panel1, label1

panel1.MouseMove += panel1_MouseMove
panel1.MouseDown += panel1_MouseDown

单击时MouseDown+Left Button->单击时保存初始鼠标位置MouseMove+Left Button->将当前鼠标位置与保存的初始位置之间的差异移动(面板1 +标签1)。

完成。

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;
        }
    }
}
于 2009-09-09T10:20:11.627 回答