在运行时对齐控件时的Snap-To行

时间:2010-02-05 23:36:15

标签: c# winforms canvas lines

我有一个应用程序,用户可以在窗体上拖动控件。但是他们 请求我使用Snap-To线来简化控件的对齐。我不知道偷偷摸摸的行以及如何实现它们 - 我已经看过了:

http://msdn.microsoft.com/en-us/library/ms752100.aspx Adorner's,但它说这只适用于WPF。我在WinForms中尝试过但是(正如预期的那样)没有用。

如何在我的应用中获得对齐线(类似于VS中的那些)?

谢谢

巴尔

3 个答案:

答案 0 :(得分:1)

您是否在CodeProject上看过这篇文章:

Form Designer

它具有与设计图面上网格的对齐功能。

答案 1 :(得分:1)

在您的移动控件中,您可以通过除以行的宽度然后乘以LeftTop进行调整:

left = (left/10)*10;
top = (top/10)*10;

它并不完美,但它很简单。当然,由于控件没有MoveEnd事件,您必须跟踪MouseButton状态或类似的东西。

编辑:更好的实施方案可以正确地舍入除法结果,因此134 = 130和136 = 140。

答案 2 :(得分:0)

我有同样的问题,我仍在寻找解决方案;这是我到目前为止所做的,它可能是你的解决方案

const grid = 12;
private void MyControl_LocationChanged(object sender, EventArgs e)
{
    if (this.Left % grid != 0)
        this.Left -= this.Left % grid;
    if (this.Top % grid != 0)
        this.Top -= this.Top % grid;
}

或用户控件

protected override void OnMove(EventArgs e)
{
    if (this.Left % grid != 0)
        this.Left -= this.Left % grid;
    if (this.Top % grid != 0)
        this.Top -= this.Top % grid;
}

我目前的挑战是绘画活动;我的控件托管在面板中,我正在寻找一种方法来在必要时锁定和解锁面板图;例如:仅在左侧或顶部更改后