C# 如何在paint事件中保留以前的图形?

C# 如何在paint事件中保留以前的图形?,c#,winforms,C#,Winforms,我正在使用 e.Graphics.FillEllipse(Brushes.Red, ph1.X,ph1.Y, 20, 20); 在面板1\u Paint事件中绘制椭圆。点ph1值来自textbox\u按键 我还添加了panel1.Invalidate()按键事件,强制重新绘制面板1。它所做的是清除panel1,然后添加新图形 我真正希望它做的是添加新图形,而不清除以前的图形。 有什么方法可以做到这一点吗?最简单的方法是创建对象的有序集合(例如列表),每次调用OnPaint事件时都会重新绘制这些

我正在使用

e.Graphics.FillEllipse(Brushes.Red, ph1.X,ph1.Y, 20, 20);
面板1\u Paint
事件中绘制椭圆。点
ph1
值来自
textbox\u按键

我还添加了
panel1.Invalidate()按键事件,强制重新绘制
面板1
。它所做的是清除panel1,然后添加新图形

我真正希望它做的是添加新图形,而不清除以前的图形。


有什么方法可以做到这一点吗?

最简单的方法是创建对象的有序集合(例如列表),每次调用OnPaint事件时都会重新绘制这些对象

比如:

    // Your painting class. Only contains X and Y but could easily be expanded
    // to contain color and size info as well as drawing object type.
    class MyPaintingObject
    {
        public int X { get; set; }
        public int Y { get; set; }
    }

    // The class-level collection of painting objects to repaint with each invalidate call
    private List<MyPaintingObject> _paintingObjects = new List<MyPaintingObject>();

    // The UI which adds a new drawing object and calls invalidate
    private void button1_Click(object sender, EventArgs e)
    {
        // Hardcoded values 10 & 15 - replace with user-entered data
        _paintingObjects.Add(new MyPaintingObject{X=10, Y=15});
        panel1.Invalidate();
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        // loop through List<> and paint each object
        foreach (var mpo in _paintingObjects)
            e.Graphics.FillEllipse(Brushes.Red, mpo.X, mpo.Y, 20, 20);
    }
//你的绘画课。仅包含X和Y,但可以轻松扩展
//包含颜色和大小信息以及图形对象类型。
类MyPaintingObject
{
公共整数X{get;set;}
公共整数Y{get;set;}
}
//要在每次无效调用时重新绘制的绘制对象的类级集合
私有列表_paintingObjects=新列表();
//添加新图形对象并调用invalidate的UI
私有无效按钮1\u单击(对象发送者,事件参数e)
{
//硬编码值10和15-替换为用户输入的数据
_paintingObjects.Add(新的MyPaintingObject{X=10,Y=15});
1.使无效();
}
私有void panel 1_Paint(对象发送器,PaintEventArgs e)
{
//循环浏览列表并绘制每个对象
foreach(绘画对象中的var mpo)
e、 图形。填充椭圆(画笔。红色,mpo.X,mpo.Y,20,20);
}

你能举个例子吗@易卜拉希罗:好了。当然,您必须根据自己的需要对其进行修改。