控制组合控件中单个控件的显示和隐藏

noaskme 2018-11-20 12:34:48
我开发一个组合控件,一个panel1中,底部有个panel2,现在想实现在鼠标进入组合控件范围后,panel2显示,可以操作上面的按钮,鼠标离开组合控件范围后,panel2隐藏,现在使用了panel1的mousemove时间,可以控制panel2显示,但不知道该用什么事件来触发panel2隐藏,用panel1的mouseleave事件触发隐藏的话,当鼠标移动到panel2时,panel2会不停的触发两个事件,会让panel2不停的闪,各位大侠有啥好的解决办法?请指教
...全文
133 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-11-20
  • 打赏
  • 举报
回复

            // panel1
//
this.panel1.BackColor = System.Drawing.SystemColors.Window;
this.panel1.Controls.Add(this.panel2); //panel2 在 panel1 里面
this.panel1.Location = new System.Drawing.Point(12, 12);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(268, 219);
this.panel1.TabIndex = 0;
//
// panel2
//
this.panel2.BackColor = System.Drawing.SystemColors.Control;
this.panel2.Controls.Add(this.button1);
this.panel2.Location = new System.Drawing.Point(28, 143);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(200, 63);
this.panel2.TabIndex = 0;
    public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

panel1.MouseEnter += new EventHandler(panel1_MouseEnter);
panel1.MouseLeave += new EventHandler(panel1_MouseLeave);

panel2.MouseEnter += new EventHandler(panel2_MouseEnter);
panel2.MouseLeave+=new EventHandler(panel2_MouseLeave);
panel2.Visible = false;
}

void panel2_MouseEnter(object sender, EventArgs e)
{
panel2.Visible = true;
}
void panel2_MouseLeave(object sender, EventArgs e)
{
panel2.Visible = false;
}
void panel1_MouseLeave(object sender, EventArgs e)
{
var rect = new Rectangle(PointToScreen(panel2.Location), panel2.Size); //将 panel2 所在区域换算到屏幕坐标
if (rect.Contains(MousePosition)) return; //如果换算到屏幕坐标的鼠标位置在矩形中则不关闭 panel2 的显示
panel2.Visible = false;
}

void panel1_MouseEnter(object sender, EventArgs e)
{
panel2.Visible = true;
}
}
csdnFUCKINGSUCKS 2018-11-20
  • 打赏
  • 举报
回复
SplitContainer了解一下?

private void splitContainer1_Panel1_MouseEnter(object sender, EventArgs e)
{
    splitContainer1.Panel2Collapsed = true;
}

private void splitContainer1_Panel1_MouseLeave(object sender, EventArgs e)
{
    splitContainer1.Panel2Collapsed = false;
}
noaskme 2018-11-20
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
MouseEnter //鼠标进入时发生。用 MouseMove 也可以,但他应该还有其他的用处,况且每次鼠标移动都控制 panel2 的显示也太频繁了没必要
MouseLeave //鼠标离开时发生

panel1.MouseEnter panel2显示
panel1.MouseLeave panel2不显示
panel2.MouseEnter panel2显示
panel2.MouseLeave panel2不显示


鼠标移动到panel2上时,不停的触发panel1的leave和enter,闪烁个不停,因为panel2是在panel1里面的
xuzuning 2018-11-20
  • 打赏
  • 举报
回复
MouseEnter //鼠标进入时发生。用 MouseMove 也可以,但他应该还有其他的用处,况且每次鼠标移动都控制 panel2 的显示也太频繁了没必要
MouseLeave //鼠标离开时发生

panel1.MouseEnter panel2显示
panel1.MouseLeave panel2不显示
panel2.MouseEnter panel2显示
panel2.MouseLeave panel2不显示

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧