C# Windows 窗体 - 带有事件的不可见元素(单击和 MouseEnter/Leave)

Posted

技术标签:

【中文标题】C# Windows 窗体 - 带有事件的不可见元素(单击和 MouseEnter/Leave)【英文标题】:C# Windows Forms - Invisible Element with Events (Click and MouseEnter/Leave) 【发布时间】:2021-12-28 07:29:47 【问题描述】:

我在我的项目中将几个标签直接相邻排列。现在,当我大约处于它们之间的边缘时,我想执行诸如 Click 或 MouseEnter/Leave 之类的事件。我试图在这个位置放置一个不可见的元素并从这个元素中捕获事件,但是一旦我使元素不可见,这些事件就不再起作用了。

我希望这不仅适用于 2 个标签之间的边缘,还适用于拐角处,以便在此拐角处停靠多达 4 个标签。

重要的是,我需要在事件中知道它是哪个边或角,以及分别停靠在哪个标签上。

我附上了一张图片以更好地可视化这一点。突出显示的地方只是我想捕捉这些事件的例子。但应该可以在标签之间的任何边缘和角落。

【问题讨论】:

【参考方案1】:

也许一种选择是自己绘制标签的边框,然后你不需要在中间放置元素。

private void label3_Paint(object sender, PaintEventArgs e)

    e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Red), 10f), label3.ClientRectangle);
    base.OnPaint(e);

因此,如果您在标签上添加 Paint Event,则可以绘制边框(此处为红色,宽度为 10)。边框被视为标签的一部分,所以在边框上执行的所有事件都会以相同的方式触发,

【讨论】:

好的,我似乎忘记在我的问题中提及一些重要的事情。事件执行后,我还想知道它是在哪个边缘执行的。所以我需要停靠在事件边缘或角落的所有标签。【参考方案2】:

实现此目的的一种方法是添加一个标签作为背景,您可以将其设置为与表单背景相同的颜色,使其显示为隐藏。

然后,您可以将点击、进入和离开事件附加到该标签,一旦您将其他标签之一的鼠标光标移动到背景标签上,该事件就会触发。

我已经模拟了这个屏幕,背景标签颜色较深,以便您可以看到:

我将深色背景命名为“lblBackdrop”,并将文本框命名为“txtMessage”。

然后我将以下处理程序附加到背景标签:

using System;
using System.Windows.Forms;

namespace WinFormsApp1

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
        

        private void lblBackdrop_Click(object sender, EventArgs e)
        
            txtMessage.Text = string.Concat(txtMessage.Text, "Background clicked\n");
        

        private void lblBackdrop_MouseLeave(object sender, EventArgs e)
                   
            txtMessage.Text = string.Concat(txtMessage.Text, "Background left\n");
        

        private void lblBackdrop_MouseEnter(object sender, EventArgs e)
        
            txtMessage.Text = string.Concat(txtMessage.Text, "Background entered\n");
        
    

【讨论】:

首先感谢您的回答。但是,我似乎忘记在我的问题中提及一些重要的事情。一旦事件被执行,我还想知道它是在哪个边缘执行的。所以我需要所有停靠在事件边缘或角落的标签。另外,我不喜欢标签之间有空格。应该只看到一个细边框,它应该从背景中脱颖而出。 对!我认为@jason.kaisersmith 的答案适用于这种情况。您必须绘制并跟踪每个边框,但它会起作用。您还可以使用 System.Windows.Forms.Control.MousePosition 之类的东西来获取鼠标坐标,然后查看所有标签并检查哪些标签可能最接近该点?

以上是关于C# Windows 窗体 - 带有事件的不可见元素(单击和 MouseEnter/Leave)的主要内容,如果未能解决你的问题,请参考以下文章

C#如何在 Windows 窗体应用程序中使用事件

如何在 C# windows 窗体中使用事件作为方法?

捕获托管在 mfc 对话框上的 windows 窗体事件(c#)

C# windows 窗体 - 关于跨线程事件的问题

当属性更改值时,在 C# Windows 窗体中定义事件[重复]

C# Windows 窗体应用程序热键 - KeyDown 事件不起作用