Pregunta

Actualmente tengo una aplicación de Windows Forms que se basa en efectos transpareny. Sin embargo, esto está demostrando ser un dolor absoluto en el preverial atrás! Winforms como el aprendizaje Im no se ocupa de la transparencia particularmente bien.

Me preguntaba si esto sería cualquier utilizando componentes más fáciles de WPF para el bit de transparencia y WinForms para el resto (aunque incluya nota de ID, como para mover toda la aplicación a WPF esto simplemente no es factible!). Yo sé casi nada acerca de WPF, de ahí la razón estoy aquí! Lo que estaba considereing era:

1) Anfitrión un componente WPF dentro de un control de usuario Winforms por ejemplo Ejemplo de Control de WPF:

<UserControl x:Class="WindowsFormsApplication1.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <Grid>
         <Rectangle Name="rectangle1" Stroke="White" Fill="Black" RadiusX="10" RadiusY="10" Opacity="0.7" />
        <Rectangle Margin="57,101,43,99" Name="dialog" Stroke="Gray" Fill="White" RadiusX="10" RadiusY="10" />
    </Grid>
</UserControl>

2) Anfitrión un control de usuario Winforms (contenido) dentro del rectángulo blanco (diálogo) del control WPF. 3) permitir que el contenido (control de usuario Winforms) para llamar código en la matriz de la WPF-Control.

Lo primero es lo primero ...

  • ¿Es esto una cosa razonable para hacerlo o estoy ladrando al árbol equivocado?
  • Se puede lograr esto de una manera más fácil?
  • ¿Puede alguien ayudarme aquí? (Código de la muestra sería recibida con gratitud!)
  • Por último ... ¿hay recursos en línea que pueden ayudar a mí a) aprender WPF y b) llegar a ser más autosuficientes?
¿Fue útil?

Solución 2

Aquí está la solución que solía resolver el problema en cuestión. Esta solución se basa en la superposición de control para hacer que su matriz de una imagen de mapa de bits. Esto entonces se pintó como el fondo del control de superposición.

public class OverlayingControl : UserControl
{
    /// <summary>
    /// Overrides the c# standard Paint Background to allow the custom background to be drawn 
    /// within the OnPaint function
    /// </summary>
    /// 
    /// <param name="e">Arguements used within this function</param>
    protected override void OnPaintBackground( PaintEventArgs e )
    {
        //Do Nothing 
    }

    protected override void OnPaint( PaintEventArgs e )
    {
        // Render the Parents image to a Bitmap. NB: bitmap dimensions and Parent Bounds can be changed to achieve the desitred effect
        Bitmap background = new Bitmap( Width, Height, PixelFormat.Format64bppArgb );
        Parent.DrawToBitmap( background, Parent.Bounds );

        // Paint background image             
        g.DrawImage( background, 0, 0, new RectangleF( Location, Size ), GraphicsUnit.Pixel );

        // Perform any alpha-blending here by drawing any desired overlay e.g.
        // g.FillRectangle( new SolidBrush( semiTransparentColor ), Bounds);
    }

}

Esto se lleva a cabo exclusivamente en el dominio de Windows Forms, sin embargo, creo que podría ser posible pasar esta imagen de mapa de bits a un control de WPF para rendir según sea necesario. Actualmente no existe ninguna disposición para la actualización del mapa de bits cuando los cambios de los padres, sin embargo, debe ser trivial para crear un método personalizado que despeja el mapa de bits y re-dibuja el control Overlayng. No es una solución elegante que cuenta ... pero parece que funciona bastante bien.

Otros consejos

Es ciertamente posible, y creo que tiene razón que sería la forma más fácil de trabajar con transparencia.

No he probado a mí mismo, pero de acuerdo con este artículo sobre CodeProject , debería ser bastante simple. Se debe utilizar la ElementHost de control para alojar su contenido de WPF.

Alojamiento WPF en un control de Windows Forms es un escenario admitido, una característica integrada en el marco. Por lo que no debería haber ningún problema en hacerlo. También hay un componente de WPF para ir hacia otro lado, WinForms de alojamiento en una aplicación WPF.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top