近期我在开发一个应用,却遇到了一个简单却令人困扰的问题。
我想要在进入其父控件时使特定控件可见/不可见,并且能够对该控件执行事件(例如:点击)。但问题是,当我进入我想要显示的控件时,鼠标悬停甚至无法作用于其父控件,这导致了我想要显示的控件闪烁不定(鼠标悬停有效 -> 控件显示 -> 鼠标悬停不再有效 -> 控件隐藏 -> 鼠标悬停有效 -> 等等)。
我已经找到了这个“解决方案”来帮助我保持“稳定”。
基本上,当我进入对象时,一个计时器开始工作,并每50毫秒检查一次鼠标是否在父控件中。如果是,则显示控件。如果不是,则停止计时器并隐藏控件。
这样,当进入我显示的控件(进入父控件)时,鼠标离开事件不会触发!它有效了!
谢谢你的回答。我想你可以继续发布你的想法,因为我在互联网上没有看到很多解决方案 :)
我想要在进入其父控件时使特定控件可见/不可见,并且能够对该控件执行事件(例如:点击)。但问题是,当我进入我想要显示的控件时,鼠标悬停甚至无法作用于其父控件,这导致了我想要显示的控件闪烁不定(鼠标悬停有效 -> 控件显示 -> 鼠标悬停不再有效 -> 控件隐藏 -> 鼠标悬停有效 -> 等等)。
我已经找到了这个“解决方案”来帮助我保持“稳定”。
// Timer to make the control appearing properly.
private void Timer_Elapsed(object o, ElapsedEventArgs e)
{
try
{
ItemToHideDisplay.Visible = true;
var mousePoint = this.PointToClient(Cursor.Position);
if (mousePoint.X > this.Width ||
mousePoint.X < 0 ||
mousePoint.Y > this.Height ||
mousePoint.Y < 0)
{
HideDisplayTimer.Stop();
ItemToHideDisplay.Visible = false;
base.OnMouseLeave(e);
}
}
catch
{
// We don't want the application to crash...
}
}
protected override void OnMouseEnter(EventArgs e)
{
HideDisplayTimer.Start();
base.OnMouseEnter(e);
}
基本上,当我进入对象时,一个计时器开始工作,并每50毫秒检查一次鼠标是否在父控件中。如果是,则显示控件。如果不是,则停止计时器并隐藏控件。
这个方法有效。太好了。但我认为这个解决方案非常丑陋。
所以我的问题是:有没有另一种方法,比这个更美观的解决方案?
如果我表述不清楚,请告诉我 :)
提前感谢!
编辑:嘿,我想我已经找到了答案!
诀窍是使用以下代码覆盖父控件的OnMouseLeave:
protected override void OnMouseLeave(EventArgs e)
{
var mousePoint = this.PointToClient(Cursor.Position);
if (mousePoint.X > this.Width ||
mousePoint.X < 0 ||
mousePoint.Y > this.Height ||
mousePoint.Y < 0)
{
base.OnMouseLeave(e);
}
}
这样,当进入我显示的控件(进入父控件)时,鼠标离开事件不会触发!它有效了!
谢谢你的回答。我想你可以继续发布你的想法,因为我在互联网上没有看到很多解决方案 :)
SetLayeredWindowAttributes
。只要注意你正在深入研究 winforms... ;) - KeyNone