Я столкнулся с некоторыми проблемами при рисовании прямоугольника (System.Drawing)
на панели.Дело в том, что я должен сделать это с помощью Задачи, чтобы пользовательский интерфейс был отзывчивым.Я подозреваю, что это проблема thread-safety
, но я не уверен.Когда у меня возникали проблемы с безопасностью потоков, я решал проблему с помощью Invoke
.Но, похоже, он не работает с System.Drawing
методами.
Это мой код (запускается в событии Panel Paint):
private void setup(object sender, PaintEventArgs e) {
int x = 50;
int y = 50;
int w = 15;
int h = w;
Color color = Color.FromArgb(255, 255, 255);
Point location = new Point(x, y);
Size size = new Size(w, h);
Task t = Task.Run(()=> {
Rectangle Rect = new Rectangle(location, size);
e.Graphics.DrawRectangle(new Pen(color), Rect);
e.Graphics.FillRectangle(new SolidBrush(color), Rect);
});
}
PS: у меня есть намерение создать класс, который будет выполнять все рисование, я не знаю, сможет ли он что-то изменить позже.
Ошибка :
e.Graphics.DrawRectangle (новый Pen (цвет), Rect);строка возвращает OutOfMemory исключение.
РЕДАКТИРОВАТЬ :
Относительно темы Рисовать на форме в отдельном потоке, когда я использую этот буфер, у меня перестает появляться ошибка, но он не рисует мой прямоугольник на панели.Код ниже:
Bitmap buffer = new Bitmap(this.Width, this.Height);
Task t = Task.Run(()=> {
Rectangle Rect = new Rectangle(location, size);
using (Graphics g = Graphics.FromImage(buffer)) {
g.DrawRectangle(new Pen(color), Rect);
g.FillRectangle(new SolidBrush(color), Rect);
}
Invoke(new Action(() =>
{
BackgroundImage = buffer;
}));
});
РЕДАКТИРОВАТЬ 2:
По поводу этого кода выше, он не выглядит правильным, потому что он не использует PaintEventArgs
Panel.Вероятно, это причина того, что я не вижу прямоугольник на панели.
РЕДАКТИРОВАТЬ 3:
Этот код работает нормально, если я не использую Panel,Он может рисовать прямо в форме (когда я использую событие FormLoad).Мне просто нужно знать, как это сделать внутри панели.