Normalerweise machen Sie alle Ihre Zeichnungen im Paint Event Handler. Wenn Sie eine Aktualisierung durchführen möchten (wenn ein Benutzer zum Beispiel auf das Panel klickt), müssen Sie diese Aktion verschieben: Sie speichern die erforderlichen Daten (Koordinaten, auf die der Benutzer geklickt hat) und erzwingen ein Neuzeichnen des Steuerelements. Dadurch wird das Paint-Ereignis ausgelöst, und Sie können dann Dinge zeichnen, die Sie zuvor gespeichert haben. Ein anderer Weg wäre (wenn Sie wirklich außerhalb des Ereignisbehandlers 'panel1_Paint' zeichnen möchten), in ein Pufferbild zu zeichnen und das Bild in das Steuergrafikobjekt im Paint-Event-Handler zu kopieren.
Update:
Ein Beispiel:
public class Form1 : Form
{
private Bitmap buffer;
public Form1()
{
InitializeComponent();
// Initialize buffer
panel1_Resize(this, null);
}
private void panel1_Resize(object sender, EventArgs e)
{
// Resize the buffer, if it is growing
if (buffer == null ||
buffer.Width < panel1.Width ||
buffer.Height < panel1.Height)
{
Bitmap newBuffer = new Bitmap(panel1.Width, panel1.Height);
if (buffer != null)
using (Graphics bufferGrph = Graphics.FromImage(newBuffer))
bufferGrph.DrawImageUnscaled(buffer, Point.Empty);
buffer = newBuffer;
}
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
// Draw the buffer into the panel
e.Graphics.DrawImageUnscaled(buffer, Point.Empty);
}
private void button1_Click(object sender, EventArgs e)
{
// Draw into the buffer when button is clicked
PaintBlueRectangle();
}
private void PaintBlueRectangle()
{
// Draw blue rectangle into the buffer
using (Graphics bufferGrph = Graphics.FromImage(buffer))
{
bufferGrph.DrawRectangle(new Pen(Color.Blue, 1), 1, 1, 100, 100);
}
// Invalidate the panel. This will lead to a call of 'panel1_Paint'
panel1.Invalidate();
}
}
Jetzt sind die gezeichneten Bilder werden nicht verloren, auch nach einem Neuaufbau der Kontrolle, weil sie nur den Puffer herauszieht (das Bild, gespeichert in der Erinnerung). Außerdem können Sie jederzeit Dinge zeichnen, wenn ein Ereignis eintritt, indem Sie einfach in den Puffer zeichnen.
Verwenden Sie WinForms? Oder WPF? – Vlad
Ich benutze WinForms. – Lisa
Warum möchten Sie es woanders und nicht im Paint Event Handler platzieren? –