2009-06-17 12 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%透過的な背景ウィンドウを作成し、それをWindows上に配置することでこれを回避することができます。ホストコントロール。それを描画すると、正しく表示されます。

ややハッキリ感ですが動作します。

+0

少しハッキリですが動作します。どうもありがとう! –

+0

このパスは(ほとんどの場合)強制的にウィンドウの位置に強制的に同期することに注意してください - onDrag onResizeなどを操作してください。 – Li3ro

0

受け入れられた回答が機能します。しかし、唯一の問題は、透過ウィンドウがメインウィンドウ上に表示されることです。私はまた、すべてが同期していることを確認するために動きに突き当っていなければなりませんでした。

私は透明なウィンドウと少し違ったことをしました。これは私のケースでは機能しましたが、いつもうまくいくとは限りません。

Windowsフォームユーザーコントロールを作成しました。私は、テキストボックスと線図をウィンドウにユーザーコントロールを配置します。これにより、WindowsFormsHostを使用してWPFアプリケーションに描画して表示することができました。

2

私は同じ問題を抱えており、すべてを検索した後もWindowsFormsHostの上に透明な「オーバーレイ」ウィンドウを使用してしまいました。メインウィンドウをオーバーレイウィンドウと同期させるには、次のイベントを処理する必要があります。

MainWindowのLocationChangedイベントおよび WindowsFormsHost要素のLayoutUpdatedイベント。両方のイベントハンドラは、透明なオーバーレイウィンドウを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; 
} 
関連する問題