繁体   English   中英

C#锁定WinForm控件

[英]C# Lock WinForm Controls

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

谢谢!

Locked属性不是真正的属性,它是Windows窗体设计器添加的属性(例如Generate Member和Modifiers“ properties”)。 因此,您需要自己在表单级别或(如果需要)在控件级别(例如,锁定了控件的字典)自己进行仿真,并在编写的代码中手动检查它以在周围移动控件。

锁定控件可防止将它们拖动到设计图面上的新大小或位置。 但是,您仍然可以通过“属性”窗口或代码来更改控件的大小或位置。

MSDN

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

更新:似乎自定义设计器类可以根据控件是否处于设计模式来向控件添加属性。
如果您打算采用VS建筑锤式路径,可以在这里获得更多详细信息。 无论如何,值得花费10分钟的阅读时间。
Visual Studio .NET中的自定义设计时控件功能-Dino Esposito

我以“伪设计模式”假设您确实意味着您的应用程序处于运行时状态,并且最终用户正在经历“虚拟设计模式”:如果我错了,请纠正我。

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

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

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

一个主要的原因是,严格控制事件处理是“最佳实践”(将事件处理程序“留在原地”可能会干扰对象处理……尽管这绝不会适用于此处的情况) )。

还有一个想法:您有一个“看不见的”面板,停靠在窗体上:该面板上的所有控件都可以移动:这可以让您更轻松地“集中精力”关注哪些控件,您可以“花费”额外的钱代码。 使用这种方法的缺点通常是:

  1. 如果您使用hostingForm.ActiveControl来确定哪个控件被按下(然后可以移动):您会发现某些控件(例如标签和图片框)在单击时不会成为表单的活动控件,但是大多数做。

  2. 您需要考虑“ z顺序”,因为不在面板中的控件封装了您希望允许移动的伪透明面板后面的控件,这些控件将被隐藏。

出于这些原因,恕我直言,我认为禁用和重新启用事件处理程序附件是最好,最简单的方法,并且因为可以在控件“向下转换”到其控件“标识”时完成:

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;
    }
}

我用这种方式。

最好,比尔

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM