C#锁定WinForm控件

4
在我编写的程序中,用户可以向表单中添加控件,移动它们并在伪设计模式下设置一些属性。当他们按下按钮切换到“数据模式”时,我希望能够锁定所有这些控件到一个位置。我该怎么做呢?我想循环遍历所有控件并使用“Lock Property”,但我注意到它没有在智能感知中显示。
谢谢!
3个回答

3
Locked属性并不是一个真正的属性--它是由Windows Forms设计器添加的(就像Generate Member和Modifiers“属性”一样)。因此,您需要自己模拟它,无论是在表单级别还是(如果需要)在控件级别(例如使用控件锁定的字典),并在编写移动控件代码时手动检查它。

2
我假设你所说的“伪设计模式”是指你的应用程序处于运行时状态,而终端用户正在体验“虚拟设计模式”:如果我理解有误,请纠正我。
但是,我认为你指的是控件的设计时“锁定属性”,并且你希望在运行时“模拟”这个属性...是吗?
我还假设你正在将鼠标上下/移动处理程序附加到你允许移动的控件上,可能是通过循环遍历表单上的所有控件或控件集合来实现的。
如果我的假设是正确的,那么我建议在需要禁用控件移动时删除启用移动的事件处理程序,然后在需要再次允许控件移动时恢复这些事件处理程序。
其中一个主要原因是,我认为严格控制事件处理是“最佳实践”(保留事件处理程序可能会干扰对象的处理...尽管这在您的情况下可能不适用)。
另一个想法:你可以在填充到表单的“不可见”面板上放置所有可移动的控件:这样可以更容易地“缩小焦点”,只对你“花费”额外代码的控件进行操作。使用此方法的缺点通常有:
1. 如果你使用 hostingForm.ActiveControl 来确定哪个控件被按下鼠标(因此可以移动):你会发现一些控件,如标签和图片框,在单击时不会成为表单的活动控件,但大多数控件会。 2. 你需要考虑“z-order”,因为一个不在封装你希望允许移动的控件的面板后面的控件将被隐藏。
出于这些原因,我认为禁用和重新启用事件处理程序附件是最好、最简单的方法,因为它可以在将控件“向下转换”为它们的控件“身份”时完成。
private void enableControlsMove()
{
    foreach (Control theControl in panel1.Controls)
    {
        Console.WriteLine(theControl.Name);

        theControl.MouseDown += new MouseEventHandler(theControl_MouseDown);
        theControl.MouseUp += new MouseEventHandler(theControl_MouseUp);
        theControl.MouseMove += new MouseEventHandler(theControl_MouseMove);
    }
}

private void disableControlsMove()
{
    foreach (Control theControl in panel1.Controls)
    {
        Console.WriteLine(theControl.Name);

        theControl.MouseDown -= theControl_MouseDown;
        theControl.MouseUp -= theControl_MouseUp;
        theControl.MouseMove -= theControl_MouseMove;
    }
}

我这样使用它。
最好,比尔

那就是我昨晚在读这个之前所做的最终决定。这很简单,也很快速。 - Nathan

2
锁定控件可以防止它们在设计界面中被拖动到新的大小或位置。然而,您仍然可以通过属性窗口或者代码来改变控件的大小或位置。我猜这是一个只对设计者可见的属性。我认为您需要实现自己的冻结机制,一个小标志来在设计模式和使用模式之间切换。更新:似乎自定义设计类可以根据控件是否处于设计模式而向其添加属性。如果您打算采用VS架构方法,则可以在此处获得更多详细信息。无论如何,值得花10分钟阅读时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接