.NET 4.x Не могу динамически измененить картинку на Windows Forms - C#

Узнай цену своей работы

Формулировка задачи:

Добрый вечер, как начинающий и совсем зелёный программист столкнулся с проблемой динамического изменения картинки в Windows Forms объект типа PictureBox: Суть такова: пишу игрушку Life используя в качестве клеток жизни рисунок в PictureBox + параллельный массив объектов для самой логики игры. Для начала вот код, который работает для размещения живых клеток:
private void UnitClick(int x, int y)
        {
            bool Check_Life = GameLogic.UnitClick(x, y);
            if (Check_Life)
            {
                DrawRedRect(x*10, y*10);
            }
            else
            {
                DrawWhiteRect(x*10, y*10);
            }
        }
и сами методы отображения:
public void DrawRedRect(int x, int y)
        {
            graphics.FillRectangle(new System.Drawing.SolidBrush(Color.Red), new Rectangle(x+1, y+1, 9, 9));
            pictureBox1.Refresh();
        }

        public void DrawWhiteRect(int x, int y)
        {
            graphics.FillRectangle(new System.Drawing.SolidBrush(Color.White), new Rectangle(x + 1, y + 1, 9, 9));
            pictureBox1.Refresh();
            
        }
Код абсолютно рабочий до начала самого процесса игры. Вот метод который создаёт поток:
private void StartGame()
        {
            speedOfLifeChange = 1000;
            Generation = 0;
            gameWork = true;
            System.Threading.Thread t = new System.Threading.Thread(GameWork);
            t.Start();
        }
И метод самого потока:
private void GameWork()
        {
            do
            {
                GameLogic.CheckCells();
                for (int i = 0; i < GameLogic.Cells.GetLength(0); i++)
                {
                    for (int c = 0; c < GameLogic.Cells.GetLength(1); c++)
                    {
                        if (GameLogic.Cells[i, c].NextAlive)
                        {
                            RefreshFieldUnitFromThread(true, i * 10, c * 10);
                            
                        }
                        else
                        {
                            RefreshFieldUnitFromThread(false, i * 10, c * 10);
                        }
                    }
                }
                GameLogic.UpdateCellsStatus();
                Generation++;
                System.Threading.Thread.Sleep(speedOfLifeChange);
            } while (gameWork);
        }
А так же метод RefreshFieldUnitFromThread(bool, int int):
/// <summary>
        /// Method for GameWork thread
        /// </summary>
        /// <param name="unitStatus">If true - then red rectangle, if false - then white.</param>
        private void RefreshFieldUnitFromThread(bool unitStatus, int x, int y)
        {
            switch (unitStatus)
            {
                case true:
                    {
                        if (pictureBox1.InvokeRequired)
                        {
                            pictureBox1.Invoke(new Action<bool, int, int>(RefreshFieldUnitFromThread), unitStatus, x, y);
                        }
                        else
                        {
                            DrawRedRect(x*10, y*10);
                            this.Refresh();
                        }
                    }break;
                case false:
                    {
                        if (pictureBox1.InvokeRequired)
                        {
                            pictureBox1.Invoke(new Action<bool, int, int>(RefreshFieldUnitFromThread), unitStatus, x, y);
                        }
                        else
                        {
                            DrawWhiteRect(x*10, y*10);
                            this.Refresh();
                        }
                    }break;
 
            }
        }
этот метод вызывает всё те - же DrawWhiteRect и DrawRedRect, но изменений на картинке нет, я в качестве теста ставил мигалку, но ничего не помогало: как палка была - так и оставалась в одном положении. Помогите решить проблему, я с трудом понимаю что означает метод Invoke() у формы или pictureBox. (если быть честным - я вообще толком не понял что оно делает, понял что создаёт отдельный поток с делегатом, который сам должен пристроится к UI потоку). Как эту штуку заставить работать?

Решение задачи: «.NET 4.x Не могу динамически измененить картинку на Windows Forms»

textual
Листинг программы
private void RefreshFieldUnitFromThread(bool unitStatus, int x, int y)
        {
            switch (unitStatus)
            {
                case true:
                    {
                        this.Invoke(new Action<int, int>(DrawRedRect), x, y);
                    }break;
                case false:
                    {
                        this.Invoke(new Action<int, int>(DrawWhiteRect), x, y);
                    }break;
 
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5
Похожие ответы