2009-06-01 3 views
2

현재 transpareny 효과를 사용하는 Winforms 앱이 있습니다. 그러나 이것은 뒤에있는 진실한 고통 인 것을 증명하고 있습니다! 임 학습으로 Winforms는 투명성을 특히 잘 다루지 않습니다.C# Winforms-WPF interop

투명도 비트 및 나머지 부분에 대해 winforms를 사용하여 WPF 구성 요소를 사용하는 것이 더 쉬울 지 궁금합니다 (전체 응용 프로그램을 WPF로 옮기는 것이 좋을지도 모르겠다!). WPF에 대해서는 아무 것도 알지 못합니다. 따라서 여기에는 이유가 있습니다! 내가 고려한 것은 :

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 제어의 흰색 직사각형 (대화) 내의 윈폼 사용자 제어 (콘텐츠)를 호스팅. 3) 내용 (Winforms 사용자 정의 컨트롤)이 WPF-Control의 부모에서 코드를 호출하도록 허용합니다.

중요한 것부터 먼저 ...

  • 이 할 수있는 합리적인 일이 아니면 내가 잘못 짚었 무엇입니까?
  • 더 쉬운 방법으로이를 달성 할 수 있습니까?
  • 아무도 나를 도와 줄 수 있습니까? (샘플 코드는 감사하게 받아 들여질 것입니다!)
  • 마지막으로 ... a) WPF를 배우고 b) 자급 자족 할 수있는 온라인 리소스가 있습니까?
+1

@TK : WPF 및 Winforms와 혼합 된 렌더링 투명도가 문제이며, 그 중 하나가 해결 가능한지 여부는 알 수 없습니다. WPF와 WinForms는 근본적으로 다르며, 서로 호스트 할 수는 있지만 중첩 된 구성 요소는 올바르게 렌더링되지 않습니다. 그들은 뚜렷한 지역이 필요합니다. 나는 Adam Nathan의 책에서 그것을 읽었다 고 믿는다. 그러나 나는 그것을 참조 할 필요가 없다. 그래서 나는 틀린 것을 기억할 수있다. –

+0

@ 그렉 D : 나는 당신이 절대적으로 옳다고 믿습니다. 문제는 각 컨트롤 (WPF 또는 Winforms)이 자신의 영공을 필요로한다는 것입니다. 즉, 특정 시점에서 화면의 픽셀은 WPF 픽셀 또는 Winform 픽셀 중 하나이며이 둘의 하이브리드가 아닙니다.Winforms 구성 요소를 BMP 파일로 렌더링 한 다음 bmp 파일을 다른 컨트롤의 배경으로 렌더링하여이 문제를 해결했습니다. 지저분한 ... 네,하지만 충분히 잘 작동하는 것 같습니다. –

+0

영리한 접근법. 질문에 대한 답변에서 혼합 효과의 비트 맵으로 렌더링 할 winforms 컨트롤이있는 방법을 게시 할 수 있습니까? :) winforms 컨트롤에서 변경 사항을 캡처하고 비트 맵을 적절히 업데이트합니까? 아니면 투명도 효과 동안 winforms가 정적을 제어합니까? –

답변

1

다음은 내가 손에서 문제를 해결하는 데 사용한 해결책입니다. 이 솔루션은 컨트롤을 오버레이하여 Parent를 비트 맵 이미지로 렌더링합니다. 그러면 오버레이 컨트롤의 배경으로 그려집니다.

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

} 

그러나 나는 필요에 따라 렌더링하는 WPF 컨트롤이 비트 맵 이미지를 통과 할 수있을 수 믿습니다 윈폼 도메인 내에서 순수하게 수행됩니다. 현재 부모가 변경 될 때 Bitmap을 업데이트하는 조항이 없습니다. 그러나 비트 맵을 지우고 Overlayng 컨트롤을 다시 그리는 사용자 정의 메서드를 만드는 것이 쉽습니다. 내가 깨달은 우아한 해결책은 아니지만 충분히 잘 작동하는 것 같습니다.

4

투명하게 작업하는 것이 가장 쉬운 방법이라고 확신 할 수 있습니다.

나는 직접 시험해 보지 않았습니다. but according to this article on CodeProject, 아주 간단해야합니다. ElementHost control을 사용하여 WPF 컨텐츠를 호스팅해야합니다.

WinForms 컨트롤에서 WPF 호스팅은 지원되는 시나리오로, 프레임 워크에 내장 된 기능입니다. 따라서 그렇게하는 데 아무런 문제가 없어야합니다. WPF 응용 프로그램에서 WinForms를 호스팅하는 다른 방법으로 이동하기위한 WPF 구성 요소도 있습니다.

+0

링크를 가져 주셔서 감사합니다 ... 정말 도움이되었습니다! 유일한 문제는 아래에 Winforms 컨트롤을 표시하도록 투명도를 렌더링하는 WPF를 얻는 것입니다. 현재 그 순간 완전히 불투명하다. –