Событие Click на PictureBox срабатывает, но никаких действий не выполняется - PullRequest
0 голосов
/ 04 февраля 2011

Я написал код, чтобы нарисовать кнопку переключения на событии MouseClick, обработанном на PictureBox с использованием C # с приложением Windows Forms. Здесь событие click срабатывает, но действие не выполняется. Может кто-нибудь сказать мне, что я делаю не так?

public partial class Form1 : Form
{
    bool flagarrow = false;

    public Form1()
    {
        InitializeComponent();

        pictureBox1.Paint += new PaintEventHandler(pictureBox1_Paint);  

    }

    void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        Point[] arrPoints = new Point[3];

        //Identify rectangle area filled by label.
        Rectangle lblBackground = (sender as Control).ClientRectangle;

        if (false == flagarrow)
        {
            //(x0,y0) for Triangle.
            arrPoints[0].X = lblBackground.Left + 5;

            arrPoints[0].Y = lblBackground.Top + 7;

            //(x1,y1) for Triangle.
            arrPoints[1].X = lblBackground.Left + 5;

            arrPoints[1].Y = lblBackground.Top + 17;

            //(x2,y2) for Triangle.
            arrPoints[2].X = lblBackground.Left + 14;

            arrPoints[2].Y = lblBackground.Top + 12;
        }
        else
        {

            //(x0,y0) for Triangle.
            arrPoints[0].X = lblBackground.Left + 5;

            arrPoints[0].Y = lblBackground.Top + 7;

            //(x1,y1) for Triangle.
            arrPoints[1].X = lblBackground.Left + 15;

            arrPoints[1].Y = lblBackground.Top + 7;

            //(x2,y2) for Triangle.
            arrPoints[2].X = lblBackground.Left + 10;

            arrPoints[2].Y = lblBackground.Top + 16;

        }

        //Fill the Triangle with Black Color. 
        e.Graphics.FillPolygon(Brushes.Black, arrPoints);
    }

    private void pictureBox1_Click(object sender, EventArgs e)
    {

        if (flagarrow == false)
        {
            flagarrow = true;
        }
        else
        {
            flagarrow = false;
        }
    }
}

Ответы [ 4 ]

4 голосов
/ 04 февраля 2011

У Winforms нет причин делать что-то особенное только потому, что вы изменили приватное поле в своем коде.Вы должны сообщить ему, что условия, которые вы используете в обработчике событий Paint, изменились, и требуется новая краска.Сделайте так, чтобы ваш обработчик событий Click выглядел следующим образом:

 flagarrow = !flagarrow;
 pictureBox1.Invalidate();
2 голосов
/ 04 февраля 2011

Сначала убедитесь, что вы подключаете событие Click.Я вижу, что это частичный класс, поэтому он может быть в коде дизайнера.Вторая попытка сделать поле с изображением недействительным после того, как они щелкнули по нему, чтобы вызвать обновление.

private void pictureBox1_Click(object sender, EventArgs e)
{

    if (flagarrow == false)
    {
        flagarrow = true;
    }
    else
    {
        flagarrow = false;
    }

    pictureBox1.Invalidate();
}
2 голосов
/ 04 февраля 2011

Событие PictureBox.Click действительно вызывается, и я подозреваю, что код в вашем обработчике событий работает точно так, как ожидалось.

Проблема в том, что все, что вы делаете внутри этого метода обработчика событий, это установказначение переменной (flagarrow). Вы не сделали ничего, что привело бы к перерисовке элемента управления PictureBox. Его событие Paint никогда не вызывалось, и поэтому его внешний вид остается неизменным.

Исправлениепросто: бросить вызов метода Invalidate . Это заставит элемент управления PictureBox перерисовать себя.И пока мы работаем над этим, вы можете также немного очистить свой код.

Измените код в обработчике событий Click следующим образом:

private void pictureBox1_Click(object sender, EventArgs e)
{
    flagarrow = !flagarrow;
    pictureBox1.Invalidate();
}
0 голосов
/ 04 февраля 2011

Вам нужно просто изменить событие клика в картинке следующим образом:

private void pictureBox1_Click(object sender, EventArgs e)
{
            if (flagarrow == false)
            { 
                flagarrow = true; 
            } 
            else 
            { 
                flagarrow = false;
            }
            //Add this following line to repaint the picture box.
            pictureBox1.Refresh();

}
...