문제

여기 내 XAML이 있습니다

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

    </WindowsFormsHost>
</Grid>

양식의로드에서 다음 방법을 실행합니다.

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

이 줄은 다음 줄을 댓글을 달 때만 그려집니다.

this.winFormsHost.Child = oldSchoolTextbox;

WindowsFormShost 컨트롤 위에 선을 그리는 방법은 무엇입니까?

도움이 되었습니까?

해결책

Microsoft가 "공역"이라고 불리는 것이 있습니다. 여기에 있습니다 공역을 설명하는 WPF Interop 페이지. [DX 초점은 있지만, 명시된대로 WindowsFormShost에도 동일한 것이 적용됩니다.

WindowsFormShost (자식이있을 때)는 별도의 HWND를 생성하여 WPF 렌더링 컨텍스트가 해당 사각형에 표시되는 것을 방지합니다.

이 작업을 수행하기위한 최선의 선택에는 .NET 3.5SP1 (적어도 안정적으로 작동)이 필요합니다. 완전히 분리 된 100% 투명한 배경 창을 만들고 Windows Forms 호스트 컨트롤 위에 배치하여이 문제를 해결할 수 있습니다. 그런 다음 그것에 그려서 올바르게 표시됩니다.

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

다른 팁

나는 같은 문제를 겪었고 온통 검색 후 WindowsFormShost 위에 투명한 '오버레이'창을 사용했습니다. 기본 창을 오버레이 창과 동기화하려면 다음 이벤트를 처리해야합니다.

WindowsFormShost 요소의 메인 원도 및 레이아웃 업 이벤트에 대한 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;
}

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

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

Windows Form 사용자 컨트롤을 만들었습니다. Windows 양식 사용자 컨트롤에 텍스트 상자와 줄 그리기를 넣었습니다. 그런 다음 WindowsFormShost를 사용하여 WPF 응용 프로그램에 표시하고 WPF 응용 프로그램에 표시 할 수있었습니다.

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