Questo è abbastanza in grado di fare in Winforms, deve solo guardare come una dissolvenza. Una tecnica consiste nell'utilizzare Control.DrawToBitmap() per creare una bitmap del controllo. E quindi si fondono da una bitmap di sfondo alla bitmap in primo piano con un timer.
Userò un UserControl invece di un Pannello in modo da poter progettare il controllo con il progettista Winforms. Il codice funzionerà comunque con qualsiasi tipo di controllo. Aggiungi una nuova classe al tuo progetto e incolla il codice mostrato di seguito. Compilare. Crea il tuo UserControl da questo con Project + Aggiungi nuovo elemento, nodo Windows Form, modello "Controllo degli utenti ereditati" e seleziona FadeControl dall'elenco popup. Progetta il controllo utente normalmente.
Come scritto, il controllo si dissolverà automaticamente dal BackColor del genitore al contenuto del controllo non appena si aggiunge il controllo al genitore. Chiama FadeOut() per farlo fondere sullo sfondo. Passa true se si desidera disporre automaticamente il controllo quando viene eseguito lo sbiadimento. È possibile utilizzare FadeIn() e la proprietà Faded per il controllo manuale della dissolvenza. Puoi regolare i numeri nelle linee commentate con // modificabili per regolare l'animazione. È necessario ulteriore lavoro se il genitore ha uno sfondo non opaco.
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
class FadeControl : UserControl {
public FadeControl() {
pbox = new PictureBox();
pbox.BorderStyle = BorderStyle.None;
pbox.Paint += new PaintEventHandler(pbox_Paint);
fadeTimer = new Timer();
fadeTimer.Interval = 15; // tweakable
fadeTimer.Tick += new EventHandler(fadeTimer_Tick);
}
public bool Faded {
get { return blend < 0.5f; }
}
public void FadeIn() {
stopFade(false);
createBitmaps();
startFade(1);
}
public void FadeOut(bool disposeWhenDone) {
stopFade(false);
createBitmaps();
disposeOnComplete = disposeWhenDone;
startFade(-1);
}
private void createBitmaps() {
bmpBack = new Bitmap(this.ClientSize.Width, this.ClientSize.Height);
using (var gr = Graphics.FromImage(bmpBack)) gr.Clear(this.Parent.BackColor);
bmpFore = new Bitmap(bmpBack.Width, bmpBack.Height);
this.DrawToBitmap(bmpFore, this.ClientRectangle);
}
void fadeTimer_Tick(object sender, EventArgs e) {
blend += blendDir * 0.02F; // tweakable
bool done = false;
if (blend < 0) { done = true; blend = 0; }
if (blend > 1) { done = true; blend = 1; }
if (done) stopFade(true);
else pbox.Invalidate();
}
void pbox_Paint(object sender, PaintEventArgs e) {
Rectangle rc = new Rectangle(0, 0, pbox.Width, pbox.Height);
ColorMatrix cm = new ColorMatrix();
ImageAttributes ia = new ImageAttributes();
cm.Matrix33 = blend;
ia.SetColorMatrix(cm);
e.Graphics.DrawImage(bmpFore, rc, 0, 0, bmpFore.Width, bmpFore.Height, GraphicsUnit.Pixel, ia);
cm.Matrix33 = 1F - blend;
ia.SetColorMatrix(cm);
e.Graphics.DrawImage(bmpBack, rc, 0, 0, bmpBack.Width, bmpBack.Height, GraphicsUnit.Pixel, ia);
}
private void stopFade(bool complete) {
fadeTimer.Enabled = false;
if (complete) {
if (!Faded) this.Controls.Remove(pbox);
else if (disposeOnComplete) this.Dispose();
}
if (bmpBack != null) { bmpBack.Dispose(); bmpBack = null; }
if (bmpFore != null) { bmpFore.Dispose(); bmpFore = null; }
}
private void startFade(int dir) {
this.Controls.Add(pbox);
this.Controls.SetChildIndex(pbox, 0);
blendDir = dir;
fadeTimer.Enabled = true;
fadeTimer_Tick(this, EventArgs.Empty);
}
protected override void OnCreateControl() {
base.OnCreateControl();
if (!DesignMode) FadeIn();
}
protected override void OnResize(EventArgs eventargs) {
pbox.Size = this.ClientSize;
base.OnResize(eventargs);
}
protected override void Dispose(bool disposing) {
if (disposing) {
stopFade(false);
pbox.Dispose();
fadeTimer.Dispose();
}
base.Dispose(disposing);
}
private PictureBox pbox;
private Timer fadeTimer;
private Bitmap bmpBack, bmpFore;
private float blend;
private int blendDir = 1;
private bool disposeOnComplete;
}
fonte
2012-04-16 21:21:14
sai. il 'pannello' non ha alcuna proprietà' opacity'. non può essere possibile. dovresti usare 'WPF' per farlo! –
Domanda @SteveWong aggiornata. –
Utilizzare invece WPF –