C#锁定WinForm控件

C#锁定WinForm控件,c#,winforms,controls,locking,C#,Winforms,Controls,Locking,在我编写的程序中,用户可以将控件添加到表单中,并在伪设计模式下移动它们和设置一些属性。我想能够锁定所有这些控制在一个位置时,他们按下按钮切换到“数据模式”。我该怎么做?我希望能够遍历所有控件并使用Lock属性,但我注意到它没有在intellisense中显示 谢谢 锁定的属性不是实属性——它是由Windows窗体设计器添加的属性(如生成成员和修饰符“属性”)。因此,您需要自己在表单级别或(如果需要)在控件级别(比如使用锁定控件的字典)模拟它,并在为移动控件而编写的代码中手动检查它 锁定控件可防止

在我编写的程序中,用户可以将控件添加到表单中,并在伪设计模式下移动它们和设置一些属性。我想能够锁定所有这些控制在一个位置时,他们按下按钮切换到“数据模式”。我该怎么做?我希望能够遍历所有控件并使用Lock属性,但我注意到它没有在intellisense中显示


谢谢

锁定的属性不是实属性——它是由Windows窗体设计器添加的属性(如生成成员和修饰符“属性”)。因此,您需要自己在表单级别或(如果需要)在控件级别(比如使用锁定控件的字典)模拟它,并在为移动控件而编写的代码中手动检查它

锁定控件可防止它们 被拖到一个新的尺寸或 设计图面上的位置。 但是,您仍然可以更改大小 或通过以下方式确定控件的位置: 属性窗口或在代码中

我想这是一个只对设计师可见的属性。我认为您必须实现自己的冻结机制——一个在设计和使用模式之间切换的小标志

更新:似乎自定义设计器类可以根据控件是否处于设计模式向控件添加属性。
如果您打算采用VS architectural hammer路径,此处提供更多详细信息。无论如何,这相当于10分钟的阅读时间。

我假设“伪设计模式”是指您的应用程序处于运行时状态,并且最终用户正在体验“虚拟设计模式”:如果我错了,请纠正我

但是,我假设您指的是控件的设计时“锁定”属性,并且希望在运行时“模拟”它。。。对吗

我还假设您正在将鼠标上/下/移动处理程序附加到允许移动的控件上,可能是通过循环遍历窗体上的所有控件或控件的子集(或您维护的允许移动的控件集合)

如果我的假设是正确的,我会删除在需要禁用控件移动时启用移动的事件处理程序,然后在需要再次移动控件时恢复这些事件处理程序

一个主要原因是,imho严格控制事件处理是“最佳实践”(将事件处理程序留在“适当位置”可能会干扰对象处理……尽管这可能不适用于您的场景)

还有一个想法:你有一个“不可见”的面板停靠在表单上:在这个面板上有所有可以移动的控件:这可以让你更容易地“缩小你的注意力”在哪些控件上“花费”这些额外的代码。使用这种方法的缺点通常是:

  • 如果您使用hostingForm.ActiveControl来确定哪个控件被鼠标向下移动(因此可以移动):您会发现一些控件,如标签和图片框,在单击时不会成为窗体的ActiveControl,但大多数会

  • 您需要考虑一个“z顺序”问题,因为面板中没有封装您希望允许移动的控件的控件发送到伪透明面板后面,该控件将被隐藏

  • 出于这些原因,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;
        }
    }