我有以下问题,因为我很新,我不知道我是否在问正确的问题......希望有人能把我放在正确的方向,提前谢谢。
我有一个小组。里面有一个文本框(与面板大小相同(140 * 40)和一个pictureBox(较小,在右上角,15 * 15)。当我MouseHover
面板时(我能够)和文本框一起显示带有删除图像的pictureBox。但如果我将鼠标放在图片框上,它就会消失,我希望只有当我MouseLeave
文本框或面板时才会发生这种情况。
一所大学告诉我,我必须使用父母属性,但我不知道我该怎么做。
我不知道我的解释是否有用,但我在这里留下了一些代码,所以你可以指出我的解决方案。
Textbox
为tbRole
,Panel
为pnRole
,PictureBox
为pbDeleteX
:
tbRole.MouseMove += (senderL, eL) =>
{
if (mouseHover)
{
pbDeleteX.Visible = true;
mouseHover = true;
}
else
{
pbDeleteX.Visible = true;
mouseHover = false;
}
tbRole.BackColor = Color.AliceBlue;
pnRole.BackColor = Color.AliceBlue;
// Je dois mettre ici le DoDragDrop parce que sinon sa ne marche pas le doubleclick
if (eL.Button == MouseButtons.Left)
{
idRoleG = idRoleL;
tbRole.BringToFront();
clRol = tbRole.BackColor;
mouseDown = true;
tbRole.AllowDrop = true;
tbRole.DoDragDrop(tbRole, DragDropEffects.Move);
}
};
tbRole.MouseHover += (senderL, eL) =>
{
if (mouseHover)
{
pbDeleteX.Visible = true;
mouseHover = false;
}
else
{
pbDeleteX.Visible = false;
mouseHover = false;
}
tbRole.BackColor = pnRole.BackColor = Color.AliceBlue;
};
tbRole.MouseLeave += (senderL, eL) =>
{
pnRole.BackColor = Color.Bisque;
tbRole.BackColor = Color.Bisque;
if (mouseHover)
{
pbDeleteX.Visible = true;
mouseHover = false;
}
else
{
pbDeleteX.Visible = false;
mouseHover = true;
}
};
答案 0 :(得分:1)
我认为这是因为当您将鼠标光标悬停在pictureBox
上时,tbRole.MouseLeave
被触发。您可以使用断点检查它,看看它是否真的发生。您可以做的是编写2个布尔变量。例如,您可以说:
tbRole.MouseLeave += (senderL, eL) =>
{
boolText == false;
if(boolText == false && boolPic == false) {
pnRole.BackColor = Color.Bisque;
tbRole.BackColor = Color.Bisque;
pbDeleteX.Visible = false;
}
};
这就是:
boolText == true
和boolPic == false
boolText == false
和boolPic == true
。 MouseLeave没有被解雇boolText == true
和boolPic == false
boolText == false
和boolText == false
。 MouseLeave最终触发,picBox消失。 因此,您必须添加pictureBox
的MouseHover和MouseLeave的代码,并且如果触发MouseHover则表示全局变量boolPic == true
,并且在触发MouseLeave时表示boolPic == false
。在文本框的MouseHover和MouseLeave中添加相同的逻辑。然后我希望它应该工作。 :P
答案 1 :(得分:1)
谁是父母,表格或小组无关紧要,所以你可以简单地告诉我们:textbox(tb)和picturebox(pb)。
接下来,你必须知道,每个控件实际上是一个窗口(带句柄的资源)。当您将鼠标移动到任何窗口时,对于任何上一个窗口(如果有),MouseEnter
事件发生后,您将立即获得此MouseLeave
事件
这称为WinAPI,风暴遵循其规则。
现在,您需要关注:
我不知道您为什么使用MouseHover
(指定用于显示工具提示)或MouseMove
(用于许多内容,但通常使用鼠标捕获或利用MouseLeave
清理。
我不知道最好的方法,但你可以:
在MouseEnter
上捕获鼠标,显示pb。在MouseMove
检查时,当你离开tb界限时,如果你是 - 释放鼠标,隐藏pb。
因为你的pb在tb界限内,所以它将按原样运行。
在MouseEnter
显示pb。在MouseLeave
启动计时器上。在计时器打勾(0.5秒后?)停止计时器并隐藏pb。 PB还必须有MouseEnter
和MouseLeave
。在pb MouseEnter
中,你停止计时器。在pb MouseLeave
你隐藏了pb。