Как создать эффект наведения для группы элементов управления? - PullRequest
0 голосов
/ 13 июля 2011

Это кажется таким простым, но я просто не могу понять.

См. Изображение ниже:

enter image description here

Это панель с5 ярлыков на нем.

Мне нужно поведение, которое заключается в том, что если мышь входит в поле (где угодно), цвет фона меняется (например, AliceBlue вместо White).Проблема в Windows Forms, прозрачность среди других проблем.Если я установил фон панели при вводе мышью, все надписи все равно будут иметь белый фон, и поэтому у меня будут белые блоки вокруг надписей.И т.д.

Я уверен, что другие столкнулись с этой проблемой.И я уверен, что это просто.Я просто не могу получить это.

1 Ответ

2 голосов
/ 13 июля 2011

BackColor - это свойство ambient.Это не работает правильно, потому что вы устанавливаете метки BackColor явно.Щелкните правой кнопкой мыши свойство BackColor надписей и выберите «Сброс», чтобы оно больше не отображалось жирным шрифтом.Изменение BackColor панели теперь также автоматически изменит BackColor меток.

Это, тем не менее, не решит вашу проблему.Событие MouseLeave панели будет срабатывать, когда вы наводите указатель мыши на одну из меток.В Winforms нет чистого решения для этого, подписка на все метки и события MouseEnter / Leave панели не устраняют угловые случаи.Например, когда пользователь очень быстро перемещает мышь от метки, которая находится близко к краю панели.Вы получите MouseLeave для метки, но не MouseEnter + Leave для панели.

Единственным хорошим решением для этого является таймер или событие Application.Idle.Как это:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        Application.Idle += Application_Idle;
    }
    protected override void OnFormClosed(FormClosedEventArgs e) {
        Application.Idle -= Application_Idle;
        base.OnFormClosed(e);
    }
    void Application_Idle(object sender, EventArgs e) {
        var pos = panel1.PointToClient(Cursor.Position);
        if (panel1.DisplayRectangle.Contains(pos)) panel1.BackColor = Color.Red;
        else panel1.BackColor = this.BackColor;
    }
}
...