只是想知道其他人是否可以重新創建這個還是只有我:)
- 在表單上放置一個面板
- 在面板上放一個按鈕
- 創建單擊按鈕“我是按鈕”
以上作業正常
- 將 onm ouseleave 添加到對 false 可見的面板設定按鈕
- 將 onm ouseenter 添加到面板設定按鈕可見為 true
現在,如果您將滑鼠移入和移出面板,則該按鈕將變為可見錯誤。完美。
現在將滑鼠移回 intp 面板,按鈕變為可見。完美的。
點擊按鈕現在什么都不做(點擊事件丟失?)
onclick 中的斷點永遠不會觸發。
這是一個不能做的概念嗎?
'更新' 它不會讓我發表長評論。
首先感謝您的快速回復。
我沒有包含代碼,因為這是一個非常大的專案,所以我用一個全新的應用程式重新創建了它。
C# WinForm 具有一個面板和一個面板上的按鈕。
我沒有嘗試點擊一個不可見的按鈕。我不僅可以看到該按鈕,而且可以看到它回應點擊了 bing。
@史蒂夫。好點,按鈕在面板內部,但我知道你要去哪里。我剛剛進行了一個新的測驗。
如果我將滑鼠移入和移出面板,按鈕將完美顯示和隱藏。在此之后,在按鈕上按 enter 將執行 onclick 但滑鼠不會。(我想這與一個按鈕有關,它是默認的。)
提示滑鼠不觸發單擊事件的原因超出了我的范圍。很奇怪。
我要實作的目標:螢屏上的一個區域,當滑鼠進入該區域時,會出現一組按鈕,以便可以使用它們。當滑鼠離開該區域時,按鈕將消失。正如我原來的帖子所說,如果可見性沒有改變,按鈕就可以正常作業。
uj5u.com熱心網友回復:
我想你的代碼有以下問題:
- 您在面板上收到 mouseenter 事件并使按鈕可見
- 您將滑鼠移到按鈕上
最后一個動作觸發面板上的 mouseleave 事件。
結果,您的按鈕變得不可見。
但是使按鈕不可見會在面板上觸發 mouseenter 并且眨眼間按鈕再次可見并導致面板上的 mouseleave。
這兩個事件之間的無限回圈開始了。
所以點擊事件不會丟失,只是它永遠不會觸發,因為表單引擎正忙于隱藏和顯示按鈕控制元件。
我已經重現了這種情況并修復了它,為 MouseMove 事件添加了一個事件處理程式。在這個事件中,我設定了一個變數來阻止兩個事件之間的無限回圈......
這是我適應你真實代碼的例子,在 LinqPad 中試試
public class Form1 : Form
{
Button b1 = new Button();
Panel p1 = new Panel();
bool stillOnPanel = false;
public Form1()
{
b1.Text = "ClickMe";
b1.Click = onClick;
b1.Visible = false;
p1.MouseEnter = onEnter;
p1.MouseLeave = onLeave;
p1.MouseMove = onMove;
p1.BorderStyle = BorderStyle.FixedSingle;
p1.Size = new Size(150,100);
this.Controls.Add(p1);
p1.Controls.Add(b1);
}
void onClick(object sender, EventArgs e)
{
Console.WriteLine("Clicked");
}
void onMove(object sender, MouseEventArgs e)
{
//Check if we are still over the panel area
stillOnPanel = b1.ClientRectangle.Contains(p1.PointToClient(Cursor.Position));
}
void onEnter(object sender, EventArgs e)
{
if (!b1.Visible)
{
b1.Visible = true;
}
}
void onLeave(object sender, EventArgs e)
{
// Do not hide the button if we are over it, let it click....
if (b1.Visible && !stillOnPanel)
{
b1.Visible = false;
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/406561.html
標籤:
