Estoy tratando de implementar una manera de animar (traducir, fade) controles (más de uno al mismo tiempo posiblemente) elegantemente. Por ejemplo, digamos que yo tenía una imagen en la esquina superior izquierda, y un cuadro de texto en la esquina inferior derecha, me gustaría poder disponer de ellos suavemente deslice a través de la ventana y cambiar de lugar. He estado trabajando durante un tiempo, pero no han llegado a algo que logra este bien o con facilidad.

OriginalEl autor caesay | 2010-05-27

5 Comentarios

  1. 19

    Compruebe el dot net-transiciones proyecto en Google Code. ahora Hay un clon en Github aquí. también está disponible en nuget como dot-net-transitions. Soporta una variedad lineal/no lineal transiciones incluyendo compuestos de transiciones que pueden ser utilizados para efectos más complejos tales como el rizado.

    Aquí es un ejemplo que muestra su comportamiento deseado:

    var pictureBox = new PictureBox
        {
            ImageLocation = "http://icons2.iconarchive.com/icons/klukeart/summer/128/hamburger-icon.png",
            SizeMode = PictureBoxSizeMode.AutoSize
        };
    var textBox = new TextBox
        {
            Text = "Hello World",
            Location = new Point(140, 140)
        };
    var form = new Form
        {
            Controls =
            {
                textBox,
                pictureBox
            }
        };
    form.Click += (sender, e) =>
        {
            //swap the Left and Top properties using a transition
            var t = new Transition(new TransitionType_EaseInEaseOut(1000));
            t.add(pictureBox, "Left", textBox.Left);
            t.add(pictureBox, "Top", textBox.Top);
            t.add(textBox, "Left", pictureBox.Left);
            t.add(textBox, "Top", pictureBox.Top);
            t.run();
        };
    form.ShowDialog();

    OriginalEl autor Nathan Baulch

  2. 7

    Recomiendo que cambie a WPF; que haría mucho más fácil.

    Es completamente imposible a desaparecer los controles de formularios windows forms; controles de Windows no puede tener una opacidad.

    Lo más cercano que puede conseguir sería para representar el control y su área en el formulario a un par de mapas de bits, luego de fundido de los mapas de bits en un PictureBox el uso de un ColorMatrix.

    Para deslizar los controles de formularios windows forms puede utilizar un Temporizador para cambiar poco a poco la Top y/o Left propiedades de los controles y los mueva a través del formulario. Sin embargo, usted obtendrá un molesto parpadeo, que es (AFAIK) imposibles de quitar.

    Para referencia futura: this.Update(); en las afueras de la moveControl método de crear reducirá drásticamente el parpadeo, prácticamente hasta el punto de que no es perceptible a menos que usted está corriendo como un mil millones de aplicaciones a la vez.

    OriginalEl autor SLaks

  3. 2

    Que podría hacer esto en WinForms, con un gran esfuerzo, por lo que tendría a la segunda de las recomendaciones para el uso de WPF (que es esencialmente construido para este tipo de cosas).

    Su principal obstáculo para hacer esto en WinForms es el hecho de que un control de la ubicación especificada por entero, lo que significa que no se puede establecer un control de la Left propiedad 45.3425, por ejemplo. Básicamente, esto hace que la animación suave de los controles (si desea que el movimiento que los cambios de velocidades y direcciones) completamente imposible – usted recibirá un inevitable intermitencias de movimiento de esta manera (he probado, por lo que yo sé).

    Como SLaks sugerido, la única manera de hacer esto en WinForms sería «falso» por tomar «instantáneas» de cada control. Básicamente, usted podría comenzar con una invisible de mapa de bits, el tamaño del formulario, dibujado con la forma del BackColor. Usted debe crear la «instantáneas» llamando DrawToBitmap() en cada control que desea animar y crear el efecto de movimiento mediante el dibujo de las instantáneas en el lienzo (System.Drawing puede dibujar imágenes con punto flotante de coordenadas, evitando las intermitencias de entero lugares).

    Esto es demasiado maldito trabajo, sin embargo. Sólo el uso de WPF. 🙂

    Edición: debo mencionar que es en realidad fácil a hacer algo como esto en WinForms, siempre y cuando no te importa el aspecto terrible y desigual y amateur. Mis comentarios se refieren a las dificultades de hacer esto bien.

    OriginalEl autor MusiGenesis

  4. 0

    Guardar una copia de cada uno de los elementos de la » valores de x e y como un flotador.

    El uso de un temporizador, y en cada tick agregar un valor a la parte superior izquierda del elemento x e y de la posición. Restar el valor mismo de la parte inferior derecha del elemento de x y y.

    Asegúrese de utilizar la caché de valores float aquí, de lo contrario podría llegar a los errores de redondeo cuando el elemento se trasladó en el formulario.

    Si va a pintar sobre cualquier superficie que se utiliza para imágenes/controles, la invalida para cada tick.

    Debe ser muy fácil.

    Edición:

    Para la transparencia de los controles, echa un vistazo a Bob Powell Consejos & Trucos:

    http://www.bobpowell.net/transcontrols.htm

    Y aquí es su propia respuesta sobre cómo hacer semitransparente controles:

    http://www.mofeel.net/67-microsoft-public-dotnet-framework-windowsforms-controls/4860.aspx

    Eh? Ni enlace muestra cómo hacer semitransparente controles.
    El primer enlace es un gran tutorial sobre cómo crear totalmente transparente controles. El segundo enlace es de una breve discusión sobre cómo se podría crear semitransparentes controla mediante su propia costumbre de pintar con pinceles, con un valor de alfa. También menciona la advertencia de que este tipo de solución podría causar parpadeo. Bob Powell además de sugerencias en la dirección que dicho control podría lograrse mediante el uso de la LayeredWindow de la API. En cualquier caso, dependiendo de Tommy requisitos, haciendo esto en WinForms puede ser complicado.

    OriginalEl autor Pedery

Dejar respuesta

Please enter your comment!
Please enter your name here