我一直在開發一個應用程序的控制最近,發現自己被困在一個簡單的,但惱人的問題。如何顯示/隱藏鼠標懸停事件
我想提出一個具體的控制可見/不可見的,當我進入其母公司,並能夠執行的事件(例如:點擊)本控制。問題是,當我輸入我想要顯示的控件時,鼠標懸停在父項中甚至無法工作。這導致我想要顯示的控制閃爍(鼠標懸停工作 - >控制顯示 - >鼠標懸停不再工作 - >控制隱藏 - >鼠標懸停工程 - >等)。
我發現這個「解決方案」,以幫助我有一些「穩定」。
// 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);
}
基本上,當我輸入對象時,定時器啓動並檢查每隔50ms,如果鼠標在父項中。如果是,則顯示控件。如果不是,則定時器停止並且控制隱藏。
This Works。好極了。但我覺得這個解決方案非常難看。
所以我的問題是:是否有另一種方法,另一種解決方案比這更漂亮?
告訴我,如果我不夠清楚:)
在此先感謝!
編輯:嘿,我想我已經找到了它自己!
關鍵是要重寫這個父控件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);
}
}
這樣一來,進入我所顯示的控制(進入父控件)時,不會觸發鼠標離開事件! 它的工作原理!
感謝您的回答。您可以繼續發表您的想法,我想,因爲我沒有看到很多的解決方案在那裏的互聯網:)
但我想仍然能夠點擊顯示的控件。 它可以被過濾嗎? – Matthieu
要麼你沒有在你的問題中這麼說,要麼就是沒有找到它。無論如何,這使得它變得更加複雜,但是這是可能的,因爲我已經做到了。我可以在幾個小時內查看我的代碼,但是您可以搜索「SetLayeredWindowAttributes」。只是要知道,你正在深入winforms挖掘...;) –
我沒有說出來,對不起。儘管我找到了解決方案。你可以看看:)。感謝這一次,我相信它會在以後幫助我! – Matthieu