Pergunta

Atualmente eu tenho um aplicativo WinForms que depende de efeitos transpareny. No entanto, este está provando ser uma dor absoluta no trás preverial! não winforms como a aprendizagem Im não lidar com transparência particularmente bem.

Eu queria saber se ou não este seria mais fácil usando componentes do WPF para o bit de transparência e winforms para o resto (nota althought Id como para mover o aplicativo inteiro até WPF isso simplesmente não é factível!). Eu sei quase nada sobre WPF, daí a razão Im aqui! O que eu estava considereing foi:

1) anfitrião um componente dentro de uma WPF WinForms de Controlo de Utilizador v.g. Exemplo de Controlo 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ão um WinForms controlo de utilizador (teor) dentro do rectângulo branco (diálogo) do controle WPF. 3) permitir que o conteúdo (WinForms controlo de utilizador) para chamar o código no pai do WPF-Control.

As primeiras coisas primeiro ...

  • Isso é uma coisa razoável a fazer ou estou latindo para a árvore errada?
  • isso pode ser alcançado de forma mais fácil?
  • Alguém
  • pode me ajudar aqui? (Exemplo de código seriam recebidas com gratidão!)
  • Finalmente ... existem recursos online que podem me ajudar a) aprender WPF e b) se tornam mais auto-suficientes?
Foi útil?

Solução 2

Aqui está a solução que eu usei para resolver o problema na mão. Esta solução baseia-se no controle de sobreposição para tornar seu pai como uma imagem de bitmap. Isso se, em seguida, pintado como o fundo do controle sobreposição.

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

}

Este é realizada exclusivamente dentro do domínio WinForms, porém eu acredito que poderia ser possível passar esta imagem bitmap para um controle WPF para tornar conforme necessário. Atualmente não há nenhuma disposição para a actualização do mapa de bits quando as mudanças pais, no entanto, deve ser trivial para criar um método personalizado que apura o bitmap e re-desenha o controle Overlayng. Não é uma solução elegante percebo ... mas parece funcionar bem o suficiente.

Outras dicas

É certamente possível, e eu acho que você está certo de que seria a maneira mais fácil de trabalhar com transparência.

Eu não tentei me, mas de acordo com este artigo sobre CodeProject , deve ser bastante simples. Você deve usar a ElementHost controle para hospedar seu WPF conteúdo.

Hospedando WPF em um controle WinForms é um cenário com suporte, uma característica embutida no quadro. Portanto, não deve haver nenhum problema em fazê-lo. Há também um componente WPF para ir para o outro lado, WinForms hospedagem em um aplicativo WPF.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top