ThisandThatorWhat Ответов: 2

Обработчики событий и щелчок мыши


Мне трудно понять, как управлять обработчиками.
Проблема в том, что у меня есть 5 picture box, и у них есть общие обработчики, например, когда я навожу на них курсор, они получают BorderStyle.Fixed3D если мышь уходит, то BorderStyle.Ничего не происходит, что работает нормально. Но вот в чем проблема.. Мне нужно щелкнуть левой кнопкой мыши, чтобы сохранить picturebox застрявшим в BorderStyle.Fixed3D но я думаю, что это не работает из-за события MouseLeave любое предложение, как это исправить ?

Что я уже пробовал:

private void SetEvents() //Initilize events
        {
            teningur1.MouseHover += PictureBoxes_MouseHover;
            teningur2.MouseHover += PictureBoxes_MouseHover;
            teningur3.MouseHover += PictureBoxes_MouseHover;
            teningur4.MouseHover += PictureBoxes_MouseHover;
            teningur5.MouseHover += PictureBoxes_MouseHover;

            teningur1.MouseLeave += PictureBoxes_MouseLeave;
            teningur2.MouseLeave += PictureBoxes_MouseLeave;
            teningur3.MouseLeave += PictureBoxes_MouseLeave;
            teningur4.MouseLeave += PictureBoxes_MouseLeave;
            teningur5.MouseLeave += PictureBoxes_MouseLeave;

            teningur1.MouseClick += PictureBoxes_MouseClick;
            teningur2.MouseClick += PictureBoxes_MouseClick;
            teningur3.MouseClick += PictureBoxes_MouseClick;
            teningur4.MouseClick += PictureBoxes_MouseClick;
            teningur5.MouseClick += PictureBoxes_MouseClick;
        }


        private void PictureBoxes_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                ((PictureBox)sender).BorderStyle = BorderStyle.Fixed3D;
                
            }
            
        }


        //Event handlers
        static private void PictureBoxes_MouseHover(object sender, EventArgs e)
        {
            ((PictureBox)sender).BorderStyle = BorderStyle.Fixed3D;
        }

        static private void PictureBoxes_MouseLeave(object sender, EventArgs e)
        {
            ((PictureBox)sender).BorderStyle = BorderStyle.None;
        }

2 Ответов

Рейтинг:
2

OriginalGriff

Каждый элемент управления имеет свойство тега: вы можете использовать его для хранения любого объекта.
Установите для свойства Tag всех ваших pictureboxes значение BorderStyle.Никто
Затем в вашем методе наведения:

PictureBox p = sender as PictureBox;
if (p != null)
    {
    p.BorderStyle = BorderStyle.Fixed3D;
    }

В отпуск иду:
PictureBox p = sender as PictureBox;
if (p != null)
    {
    p.BorderStyle = (BorderStyle) p.Tag;
    }
И ваш обработчик кликов:
PictureBox p = sender as PictureBox;
if (p != null)
    {
    p.BorderStyle = BorderStyle.Fixed3D;
    p.Tag = p.BorderStyle;
    }


ThisandThatorWhat

Исключение NullReferenceException не обработано

Произошло необработанное исключение типа "System.NullReferenceException"

Дополнительная информация: ссылка на объект не установлена на экземпляр объекта.

Это происходит, когда я навожу курсор на picturebox.

Я не понимаю, это должность.Тег

статический частный PictureBoxes_MouseLeave недействительным(объект отправителя, EventArgs в электронной)
{
Элемент управления PictureBox Р = датчик как элемент управления PictureBox;
если (p != null)
{
п. Для свойства borderstyle = (свойства borderstyle)стр. Тегов;&ЛТ;---- здесь ошибка
}
}

OriginalGriff

Это потому что вы проигнорировали первую инструкцию:
"Установите свойство Tag для всех ваших pictureboxes в BorderStyle.Никто"

ThisandThatorWhat

Кажется, я понял, но там написано:
Дополнительная информация: указанное приведение недопустимо. Система.Которого вызывается invalidcastexception'

Элемент управления PictureBox Р = датчик как элемент управления PictureBox;

если (p != null)
{
п. Для свойства borderstyle = (свойства borderstyle)стр. Тег;
}

ThisandThatorWhat

У меня есть все теги PictureBoxes, установленные в BorderStyle.Никто
Но до сих пор я получаю исключение invalidcastexception "ошибка" указанное приведение недопустимо.

OriginalGriff

Используйте отладчик, чтобы посмотреть точно, что у вас есть в теге, когда происходит исключение - я не думаю, что это то, что вы ожидаете, потому что, когда я делаю это здесь, это работает. Я подозреваю, что вы устанавливаете значение тега в неправильном месте, но я не могу видеть ваш код, чтобы быть уверенным.

ThisandThatorWhat

это.элемент управления PictureBox.Тег = "Свойства Borderstyle.Никто";

Рейтинг:
0

Peter Vegter

Решение OriginalGriff очень хорошее, но, возможно, это более удобное и легкое для понимания для вас:

Когда вы нажимаете на PictureBox, граница уже установлена на Fixed3D из-за события MouseHover (кстати, лучше использовать MouseEnter).
Поэтому, если вы хотите навсегда сохранить этот тип границы, вы можете просто отписаться от события MouseLeave (вы можете восстановить механизм границы с помощью правой кнопки мыши):

private void PictureBoxes_MouseClick(object sender, MouseEventArgs e)
{
    PictureBox pBox = sender as PictureBox;

    if (e.Button == MouseButtons.Left)
    {
        pBox.MouseLeave -= PictureBoxes_MouseLeave;                
    }
    else if (e.Button == MouseButtons.Right)
    {
        pBox.MouseLeave -= PictureBoxes_MouseLeave; // prevent double subscription
        pBox.MouseLeave += PictureBoxes_MouseLeave;
    }
}


ThisandThatorWhat

Это, кажется, не работает. Я получаю ту же ошибку

Peter Vegter

Вы должны удалить ключевое слово "static" из ваших обработчиков событий:

Изменить
статический частный PictureBoxes_MouseHover недействительным(объект отправителя, EventArgs в электронной)
к
частная PictureBoxes_MouseHover недействительным(объект отправителя, EventArgs в электронной)

то же самое со вторым (MouseLeave)