visual uso pestañas pestaña personalizar nombre deshabilitar cambiar c# .net winforms animation tabcontrol

uso - tabpanel c#



Fundido entre páginas de pestañas en un control de pestañas (5)

No hay un conmutador Fade mágico en el control de ventanas estándar.

Puede volcar el contenido de la pestaña en un mapa de bits (usando DrawToBitmap o CopyFromScreen ?), Mostrar ese mapa de bits delante de TabControl, cambiar las pestañas y luego fundir el mapa de bits.

Tengo un control de pestañas con múltiples páginas de pestañas. Quiero poder desvanecer las pestañas de un lado a otro. No veo una opción de opacidad en los controles de pestaña. ¿Hay alguna manera de causar un efecto de desvanecimiento cuando cambio de una página de pestaña a otra?


No veo una especificación de Winform / Webform, así que supongo que WebForm ...

Puedes usar un AJAX AnimationExtender.

En su defecto, una mala forma (que funcionaría) sería aceptar un QueryString que hace que la página navegue automáticamente a la pestaña que desee, y utilice Transiciones de página.

Para Winforms, puedes usar WPF :)


Dependiendo de cómo funcionan sus pestañas / página, puede manejarlo en el nivel de página agregando metaetiquetas a la página:

<meta http-equiv="Page-Enter" content="blendTrans(Duration=0)"> <meta http-equiv="Page-Exit" content="blendTrans(Duration=0)">

Simplemente cambie la duración para que el fundido sea más largo o más corto. Esto se conoce comúnmente como FAJAX.


No creo que el WPF TabControl pueda desvanecerse de un TabItem al siguiente, ya que no está equipado para mostrar múltiples TabItems simultáneamente.

Puede tratar de emular esto al unir dos ListView s (uno para la pestaña y otro para el panel) y agregar el efecto en la ControlTemplate de ControlTemplate de este último. Utilice las plantillas de control de TabControl y ListView como punto de partida.


Decidí publicar lo que hice para que mi solución funcione. GvS tuvo la respuesta más cercana y me envió en mi búsqueda en la dirección correcta, así que le di (podría ser ella, pero vamos) la marca de la respuesta correcta, ya que no puedo dármela. Nunca imaginé cómo "fundir" de una pestaña a otra (reducir la opacidad en una y subir la opacidad en la otra) pero encontré una espera para pintar una caja gris sobre un mapa de bits con más y más gris dándole el efecto de desvanecimiento en mi fondo, que también es gris. Luego empiezo la segunda pestaña como un mapa de bits de gris que poco a poco agrego menos gris combinado con la imagen de la pestaña en cada iteración dándole un efecto de fundido.

Esta solución conduce a un agradable efecto de desvanecimiento (aunque yo lo diga), pero es muy lineal. Voy a jugar un poco con un generador de números aleatorios para la variable alphablend y ver si eso podría hacerlo un poco menos lineal, pero de nuevo los usuarios pueden apreciar la predictibilidad. Por cierto, disparo el evento de pestaña de interruptor con un botón_click.

using System.Drawing.Imaging; using System.Drawing.Drawing2D; public int alphablend; public Bitmap myBitmap; private void button1_Click(object sender, EventArgs e) { alphablend = 0; pictureBox1.Visible = true; myBitmap = new Bitmap(tabControl1.Width, tabControl1.Height); while (alphablend <= 246) { tabControl1.DrawToBitmap(myBitmap, new Rectangle(0, 0, tabControl1.Width, tabControl1.Height)); alphablend = alphablend + 10; pictureBox1.Refresh();//this calls the paint action } tabControl1.SelectTab("tabPage2"); while (alphablend >= 0) { tabControl1.DrawToBitmap(myBitmap, new Rectangle(0, 0, tabControl1.Width, tabControl1.Height)); alphablend = alphablend - 10; pictureBox1.Refresh();//this calls the paint action } pictureBox1.Visible = false; } private void pictureBox1_Paint(object sender, PaintEventArgs e) { Graphics bitmapGraphics = Graphics.FromImage(myBitmap); SolidBrush greyBrush = new SolidBrush(Color.FromArgb(alphablend, 240, 240, 240)); bitmapGraphics.CompositingMode = CompositingMode.SourceOver; bitmapGraphics.FillRectangle(greyBrush, new Rectangle(0, 0, tabControl1.Width, tabControl1.Height)); e.Graphics.CompositingQuality = CompositingQuality.GammaCorrected; e.Graphics.DrawImage(myBitmap, 0, 0); }