C#Lock WinForm控件

时间:2009-11-04 01:55:51

标签: c# winforms controls locking

在我编写的程序中,用户可以向窗体添加控件并移动它们并在伪设计模式下设置一些属性。我希望能够在按下按钮切换到“数据模式”时将所有这些控件锁定到一个位置。我怎样才能做到这一点?我想能够循环遍历所有控件并使用Lock属性,但我注意到它没有出现在intellisense中。

谢谢!

3 个答案:

答案 0 :(得分:3)

Locked属性不是一个真正的属性 - 它是由Windows窗体设计器添加的属性(如“生成成员和修改器”属性“)。因此,您需要自己模拟它,无论是在表单级别还是(如果需要)在控件级别(例如,使用哪个控件被锁定的字典),并在您为移动控件而编写的代码中手动检查它

答案 1 :(得分:2)

  

锁定控件会阻止它们   被拖到一个新的大小或   在设计表面上的位置。   但是,您仍然可以更改大小   或通过控制的位置   “属性”窗口或代码。

MSDN

我猜这是一个仅限于设计师的可见属性。我认为你必须实现自己的冻结机制 - 在设计和使用模式之间切换的一个小标志。

更新:自定义设计器类似乎可以根据控件是否处于设计模式而向控件添加属性。
如果您打算采用VS建筑锤路径,可以在此处获得更多详细信息。在任何情况下,值得10分钟的阅读时间 Custom Design-time Control Features in Visual Studio .NET - Dino Esposito

答案 2 :(得分:2)

我假设“伪设计模式”你的意思是你的应用程序处于运行时状态,最终用户正在体验“虚拟设计模式”:如果我错了,请纠正我。 / p>

但是,我假设你指的是设计时间'控件的锁定属性,并且你希望在运行时“模拟”这个......正确吗?

我还假设您将鼠标向上/向下/移动处理程序附加到您允许移动的控件上,可能是通过循环遍历表单上的控件的全部或部分(或者是您的集合)允许移动控制权。)

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

一个主要原因是,imho,严格控制事件处理的“最佳实践”(将事件处理程序“就地”留下来可能会干扰对象处理......虽然这可能绝不适用于你的情况在这里。)

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

  1. 如果您使用hostingForm.ActiveControl来确定哪个控件获得了mousedown(因此可以移动):您将找到一些控件,如标签和图片框,不会成为其中的主动控件单击时形成,但大多数都是。

  2. 你有一个“z-order”的东西要考虑,因为你的面板中没有封装你希望允许在伪透明面板后发送的控件的控件将被隐藏。

    < / LI>

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

    我这样使用它。

    最好,比尔