C#锁定WinForm控件
在我编写的程序中,用户可以将控件添加到表单中,并在伪设计模式下移动它们和设置一些属性。我想能够锁定所有这些控制在一个位置时,他们按下按钮切换到“数据模式”。我该怎么做?我希望能够遍历所有控件并使用Lock属性,但我注意到它没有在intellisense中显示C#锁定WinForm控件,c#,winforms,controls,locking,C#,Winforms,Controls,Locking,在我编写的程序中,用户可以将控件添加到表单中,并在伪设计模式下移动它们和设置一些属性。我想能够锁定所有这些控制在一个位置时,他们按下按钮切换到“数据模式”。我该怎么做?我希望能够遍历所有控件并使用Lock属性,但我注意到它没有在intellisense中显示 谢谢 锁定的属性不是实属性——它是由Windows窗体设计器添加的属性(如生成成员和修饰符“属性”)。因此,您需要自己在表单级别或(如果需要)在控件级别(比如使用锁定控件的字典)模拟它,并在为移动控件而编写的代码中手动检查它 锁定控件可防止
谢谢 锁定的属性不是实属性——它是由Windows窗体设计器添加的属性(如生成成员和修饰符“属性”)。因此,您需要自己在表单级别或(如果需要)在控件级别(比如使用锁定控件的字典)模拟它,并在为移动控件而编写的代码中手动检查它 锁定控件可防止它们 被拖到一个新的尺寸或 设计图面上的位置。 但是,您仍然可以更改大小 或通过以下方式确定控件的位置: 属性窗口或在代码中 我想这是一个只对设计师可见的属性。我认为您必须实现自己的冻结机制——一个在设计和使用模式之间切换的小标志 更新:似乎自定义设计器类可以根据控件是否处于设计模式向控件添加属性。
如果您打算采用VS architectural hammer路径,此处提供更多详细信息。无论如何,这相当于10分钟的阅读时间。
我假设“伪设计模式”是指您的应用程序处于运行时状态,并且最终用户正在体验“虚拟设计模式”:如果我错了,请纠正我 但是,我假设您指的是控件的设计时“锁定”属性,并且希望在运行时“模拟”它。。。对吗 我还假设您正在将鼠标上/下/移动处理程序附加到允许移动的控件上,可能是通过循环遍历窗体上的所有控件或控件的子集(或您维护的允许移动的控件集合) 如果我的假设是正确的,我会删除在需要禁用控件移动时启用移动的事件处理程序,然后在需要再次移动控件时恢复这些事件处理程序 一个主要原因是,imho严格控制事件处理是“最佳实践”(将事件处理程序留在“适当位置”可能会干扰对象处理……尽管这可能不适用于您的场景) 还有一个想法:你有一个“不可见”的面板停靠在表单上:在这个面板上有所有可以移动的控件:这可以让你更容易地“缩小你的注意力”在哪些控件上“花费”这些额外的代码。使用这种方法的缺点通常是:
最好的,比尔,这就是我昨晚读这篇文章之前做的。它简单而快速。
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;
}
}