.NET 4.x Не могу динамически измененить картинку на Windows Forms - C#
Формулировка задачи:
Добрый вечер, как начинающий и совсем зелёный программист столкнулся с проблемой динамического изменения картинки в Windows Forms объект типа PictureBox:
Суть такова: пишу игрушку Life используя в качестве клеток жизни рисунок в PictureBox + параллельный массив объектов для самой логики игры.
Для начала вот код, который работает для размещения живых клеток:
и сами методы отображения:
Код абсолютно рабочий до начала самого процесса игры.
Вот метод который создаёт поток:
И метод самого потока:
А так же метод RefreshFieldUnitFromThread(bool, int int):
этот метод вызывает всё те - же DrawWhiteRect и DrawRedRect, но изменений на картинке нет, я в качестве теста ставил мигалку, но ничего не помогало: как палка была - так и оставалась в одном положении.
Помогите решить проблему, я с трудом понимаю что означает метод Invoke() у формы или pictureBox. (если быть честным - я вообще толком не понял что оно делает, понял что создаёт отдельный поток с делегатом, который сам должен пристроится к UI потоку).
Как эту штуку заставить работать?
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);
}/// <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;
}
}Решение задачи: «.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;
}
}