当前位置 : 主页 > 编程语言 > c++ >

C#Lock WinForm控件

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

谢谢!

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

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

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

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

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

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

>如果你使用hostingForm.ActiveControl来确定哪个控件获得了mousedown(因此可以移动):你会发现一些控件,比如标签和图片框,在点击时不会成为表单的主动控件,但是最做的.
>你有一个“z-order”的东西要考虑,因为你的面板中没有封装你希望允许在伪透明面板后发送的控件的控件将被隐藏.

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

我这样用它.

比尔,最好的

网友评论