如何在 foreach 语句中使用事件 MouseEnter?

How to use the event MouseEnter inside a foreach statement?

我正在 C# .NET 桌面上制作数独游戏。

数独面板由 81 个标签组成。我用算法在黑板上定义了他们的号码。

现在我要做的基本上是这样的:

foreach(Label l in panel1.Controls.OfType<Label>())
{
    if(l.MouseEnter == true)
    {
        l.ForeColor = Color.White;
    }
}

但是没用。有什么解决办法吗?抱歉,我不知道如何在 if 语句中使用事件。

编辑:我决定只对每个标签使用事件 MouseEnter。我知道 CS 8.0 应该支持在 foreach 内部使用事件,但不确定。

它不适合这样使用。

您应该为每个标签订阅 MouseEnter 事件,您可以对所有标签使用相同的事件处理程序方法并使用 sender 属性 来了解激活的标签。如果标签是使用设计器创建的,您可以直接在 VS 属性中订阅 window,或者您可以使用 += 运算符以编程方式进行订阅。

请参阅 https://docs.microsoft.com/en-us/dotnet/standard/events/ 或任何有关事件的在线教程。

事件是在某事发生时告诉您的事情。他们不会告诉你某事的状态。所以有几个选项

为 entering/leaving 标签的每个标签附加一个事件。您可以使用相同的 eventhandler/method 来处理每个标签的事件,并将发送者对象投射到您的标签并设置颜色。像这样的东西。请注意,这应该是 运行 一次,在构造函数中。

foreach(Label l in panel1.Controls.OfType<Label>())
{
    l.MouseEnter += (o, e) => ((Label)o).ForeColor = Color.White;
    l.MouseLeave += (o, e) => ((Label)o).ForeColor = Color.Black;
}

或者您可以使用一个循环来检查 mouse cursor position 并检查它是否在每个标签内。但是您必须 运行 循环才能改变颜色,并且 运行 一直使用它会浪费 CPU 资源。