문제

현재 투명한 효과에 의존하는 Winforms 앱이 있습니다. 그러나 이것은 배후의 사전 투구에서 절대적인 고통임을 증명하고 있습니다! IM 학습과 같은 Winforms는 투명성을 특히 잘 다루지 않습니다.

투명성 비트에 WPF 구성 요소를 사용하고 나머지는 Winforms를 사용하는 것이 더 쉬울 지 궁금합니다 (참고 전체 응용 프로그램을 WPF로 이동하는 것이 좋습니다. 이것은 가능하지 않습니다!). 나는 WPF에 대해 아무것도 알고 있지 않기 때문에 여기에 IM이 여기에 있습니다! 내가 고려했던 것은 다음과 같습니다.

1) Winforms 사용자 제어 내에서 WPF 구성 요소를 호스팅합니다. 예를 들어 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) WPF 컨트롤의 흰색 사각형 (대화 상자) 내에서 Winforms 사용자 컨트롤 (컨텐츠)을 호스팅합니다. 3) 컨텐츠 (WinForms 사용자 컨트롤)가 WPF-Control의 부모의 코드를 호출하도록 허용합니다.

먼저 첫 번째 것들...

  • 이것이 합리적인 일입니까, 아니면 내가 잘못된 나무를 짖고 있습니까?
  • 이것이 더 쉬운 방식으로 달성 할 수 있습니까?
  • 누구든지 여기서 나를 도울 수 있습니까? (샘플 코드는 감사하게 접수 될 것입니다!)
  • 마지막으로 ... a) WPF를 배우고 b) 더 자급 자족 해지는 데 도움이되는 온라인 리소스가 있습니까?
도움이 되었습니까?

해결책 2

다음은 문제를 해결하는 데 사용한 솔루션입니다. 이 솔루션은 오버레이 컨트롤에 의존하여 부모를 비트 맵 이미지로 렌더링합니다. 그런 다음 오버레이 컨트롤의 배경으로 페인트됩니다.

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

}

이것은 순전히 Winforms 도메인 내에서 수행되지만이 비트 맵 이미지를 WPF 컨트롤에 전달하여 필요에 따라 렌더링 할 수 있다고 생각합니다. 현재 부모가 변경할 때 비트 맵을 업데이트 할 수있는 조항은 없지만 비트 맵을 지우고 오버레이 컨트롤을 다시 주도하는 사용자 정의 메소드를 작성하는 것은 사소한 일이어야합니다. 내가 알고있는 우아한 해결책은 아니지만 충분히 잘 작동하는 것 같습니다.

다른 팁

확실히 가능하며, 나는 그것이 투명성으로 작업하는 가장 쉬운 방법이라고 생각합니다.

나는 그것을 직접 시도하지 않았다. 그러나 CodeProject 의이 기사에 따르면, 아주 간단해야합니다. 당신은 사용해야합니다 요소 호스트 제어 WPF 컨텐츠를 호스팅합니다.

Winforms 컨트롤에서 WPF를 호스팅하는 것은 프레임 워크에 내장 된 기능인 지원되는 시나리오입니다. 따라서 그렇게하는 데 아무런 문제가 없어야합니다. WPF 앱에서 winforms를 호스팅하는 다른 방식으로 진행하기위한 WPF 구성 요소도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top