Рисование в задании / теме - PullRequest
0 голосов
/ 25 мая 2018

Я столкнулся с некоторыми проблемами при рисовании прямоугольника (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).Мне просто нужно знать, как это сделать внутри панели.

...