Question

Actuellement, j'ai une application Winforms qui repose sur les effets transpareny. Cependant, cela se révèle être une douleur absolue dans le preverial derrière! Winforms que l'apprentissage Im ne traite pas de transparence particulièrement bien.

Je me demandais si ce serait plus facile en utilisant des composants WPF pour le bit de transparence et WinForms pour le reste (note althought Id aiment déplacer l'application sur l'ensemble de WPF c'est tout simplement pas faisable!). Je sais à peu près rien WPF, d'où la raison Im ici! Ce que je considereing était:

1) un composant hôte WPF dans un contrôle de l'utilisateur, par exemple Winforms Exemple de WPF Control:

<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) hôte d'une commande d'utilisateur Winforms (contenu) dans le rectangle blanc (dialogue) du contrôle WPF. 3) permettre au contenu (contrôle utilisateur Winforms) pour appeler le code sur le parent du WPF-Control.

Tout d'abord ...

  • Est-ce une chose raisonnable à faire ou que j'aboiements le mauvais arbre?
  • Est-ce possible dans un mode plus facile?
  • Quelqu'un peut-il me aider? (Exemple de code sera reçue avec reconnaissance!)
  • Enfin ... sont-il des ressources en ligne qui peuvent me aider a) apprendre WPF et b) devenir plus autonomes?
Était-ce utile?

La solution 2

Voici la solution que je l'habitude de résoudre le problème à la main. Cette solution repose sur le contrôle superposant à rendre son parent sous forme d'image bitmap. Cela devient alors peint en arrière-plan du contrôle superposée.

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);
    }

}

Ceci est réalisé uniquement dans le domaine WinForms, mais je crois qu'il pourrait être possible de transmettre cette image Bitmap à un contrôle WPF pour rendre au besoin. À l'heure actuelle il n'y a aucune disposition pour la mise à jour du Bitmap lorsque les parent change, cependant, il devrait être trivial pour créer une méthode personnalisée qui efface le bitmap et re-tire le contrôle Overlayng. Pas une solution élégante je réalise ... mais il semble fonctionner assez bien.

Autres conseils

Il est certainement possible, et je pense que vous avez raison que ce serait la meilleure façon de travailler avec la transparence.

Je ne l'ai pas essayé moi-même, mais selon cet article sur CodeProject , il devrait être assez simple. Vous devez utiliser le ElementHost contrôle pour héberger le contenu de votre WPF.

Hébergement WPF dans un contrôle WinForms est un scénario pris en charge, une fonctionnalité intégrée dans le cadre. Il devrait y avoir aucun problème à le faire. Il y a aussi un élément WPF pour aller dans l'autre sens, WinForms hébergement dans une application WPF.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top