2009-06-17 14 views
0

는 여기에 다음 줄을 주석 경우에만 그립니다 나는 다음과 같은 방법WPF에서는 어떻게 WindowsFormsHost에 선을 그릴 수 있습니까?

protected void OnLoad(object sender, RoutedEventArgs e) 
{ 
    // Create a line on the fly 
    Line line = new Line(); 

    line.Stroke = Brushes.Red; 
    line.StrokeThickness = 17; 

    line.X1 = 50; 
    line.Y1 = 50; 

    line.X2 = 250; 
    line.Y2 = 50; 

    this.grid.Children.Add(line); 

    System.Windows.Forms.TextBox oldSchoolTextbox = new System.Windows.Forms.TextBox(); 
    oldSchoolTextbox.Text = "A bunch of Random Text will follow. "; 
    oldSchoolTextbox.WordWrap = true; 
    oldSchoolTextbox.Width = 300; 

    for (int i = 0; i < 250; i++) 
    { 
     oldSchoolTextbox.Text += "abc "; 

     if (i % 10 == 0) 
     { 
      oldSchoolTextbox.Text += Environment.NewLine; 
     } 
    } 

    this.winFormsHost.Child = oldSchoolTextbox; 
} 

라인을 실행 형태의 부하에 내 XAML

<Grid 
    Name="grid"> 
    <TextBlock 
     Text="Some Label" /> 
    <WindowsFormsHost 
     Name="winFormsHost"> 

    </WindowsFormsHost> 
</Grid> 

입니다.

this.winFormsHost.Child = oldSchoolTextbox; 

어떻게 WindowsFormsHost 컨트롤 위에 선을 그립니 까?

답변

4

마이크로 소프트가 "공역"이라고 부르는 뭔가가있어이 일이 적어도 쉽게 일어나지 않도록합니다. 다음은 WPF Interop page describing airspace입니다. [DX 포커스가 있지만 정확히 똑같은 것이 WindowsFormsHost에 적용됩니다.]

WindowsFormsHost (자식이있는 경우)는 별도의 HWND를 만들어 WPF 렌더링 컨텍스트가 해당 사각형에 표시되지 않도록합니다.

이 문제를 해결하려면 .NET 3.5sp1 (적어도 안정적으로 작동해야 함)이 필요합니다. 완전히 별개의 100 % 투명한 배경 창을 만들어서이 창을 호스트 구성 도구 위에 놓으면이 문제를 해결할 수 있습니다. 그런 다음 그려 넣으면 제대로 표시됩니다.

다소 해킹 된 느낌이지만 작동합니다.

+0

조금 해킹되지만 작동합니다. 감사합니다! –

+0

이 경로를 사용하면 대부분의 경우 강제로 창 위치에 동기화됩니다. onDrag onResize 등을 조작하십시오. – Li3ro

0

허용되는 대답이 작동합니다. 그러나 유일한 문제는 투명 창이 내 메인 창 위에 표시된다는 것입니다. 또한 모든 것이 동기화되어 있는지 확인하기 위해 움직임에 연결해야했습니다.

나는 투명 창과 약간 다른 것을했습니다. 이것은 내 경우에 효과가 있었지만 항상 작동하지는 않습니다.

Windows Form 사용자 정의 컨트롤을 만들었습니다. 나는 텍스트 상자와 선 그리기를 윈도우 폼 사용자 컨트롤에 넣었다. 이 때 WindowsFormsHost를 사용하여 WPF 응용 프로그램에 표시하고 그 위에 표시 할 수있었습니다.

2

같은 문제가 있었는데, 모두 검색 한 후에도 WindowsFormsHost 상단의 투명 '오버레이'창을 사용하여 끝납니다. 당신의 MainWindow를 하고 WindowsFormsHost 요소에 대한 LayoutUpdated 이벤트를

LocationChanged 이벤트 : 다음 이벤트를 처리 할 필요가 오버레이 윈도우와 동기화 메인 창을 유지합니다. 이 두 이벤트 처리기는 WindowsFormsHost 윈도우 (아래 예제의 SyncOverlayPosition()) 위에 투명 오버레이 창을 이동하는 함수를 호출해야합니다.

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    this.LocationChanged += new EventHandler(MainWindow_LocationChanged); 
    _windowsFormsHost.LayoutUpdated += new EventHandler(_windowsFormsHost_LayoutUpdated); 
} 

void MainWindow_LocationChanged(object sender, EventArgs e) 
{ 
    SyncOverlayPosition(); 
} 

void _windowsFormsHost_LayoutUpdated(object sender, EventArgs e) 
{ 
    SyncOverlayPosition(); 
} 

void SyncOverlayPosition() 
{ 
    Point hostTopLeft = _windowsFormsHost.PointToScreen(new Point(0, 0));  

    _overlayWindow.Left = hostTopLeft.X; 
    _overlayWindow.Top = hostTopLeft.Y; 
    _overlayWindow.Width = _windowsFormsHost.ActualWidth; 
    _overlayWindow.Height = _windowsFormsHost.ActualHeight; 
} 
관련 문제