Frage

Hier ist meine XAML

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

    </WindowsFormsHost>
</Grid>

Auf der Last der Form ich die folgende Methode ausführen

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

Die Linie zieht nur, wenn ich die folgende Zeile auskommentieren.

this.winFormsHost.Child = oldSchoolTextbox;

Wie zeichne ich eine Linie über die Windowssteuerung?

War es hilfreich?

Lösung

Es gibt etwas, Microsoft hat „Luftraum“ genannt, der dies geschieht verhindert, zumindest leicht. Hier ist die WPF Interop Seite beschreibt Luftraum . [Es hat einen DX Fokus, aber das gleiche gilt, genau wie angegeben, auf Windows.]

Windows (wenn es ein Kind hat) erstellt eine separate HWND, die den WPF-Rendering Kontext verhindert, dass in diesem Rechteck angezeigt wird.

Die beste Option für um diese Arbeit erfordert .NET 3.5sp1 (zumindest zuverlässig zu arbeiten). Sie können dies umgehen, indem über ein eigenes, 100% transparenten Hintergrund Fenster zu schaffen, und es über die Windows Forms-Host-Kontrolle zu stellen. Sie dann in dem zeichnen, und es wird korrekt angezeigt werden.

Es ist etwas hacky Gefühl, aber es funktioniert.

Andere Tipps

Ich habe das gleiche Problem hat, und schließlich über auch am Ende mit den transparenten ‚Overlay‘ Fenstern auf dem Windows suchen. Damit Ihr Hauptfenster mit dem Overlay-Fenster synchronisiert müssen Sie die folgenden Ereignisse behandeln:

Location Ereignis für Ihre Mainwindow und Layoutupdated Ereignis für Ihr Windows Element. Diese beiden Event-Handler sollte eine Funktion aufrufen, die Ihr transparentes Overlay-Fenster bewegt sich auf dem Windowsfenster (SyncOverlayPosition () im Beispiel unten).

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

Die akzeptierte Antwort funktioniert. Doch das einzige Problem dabei ist, dass das transparente Fenster über mein Hauptfenster angezeigt wird. Ich hatte auch in Bewegung Haken sicher alles synchron geblieben zu machen.

Ich habe etwas etwas anders als ein transparentes Fenster. Das funktionierte in meinem Fall, kann aber nicht immer.

habe ich ein Benutzersteuer Windows Form. Ich legte die Textbox und die Linie auf dem Steuerfenster Form Benutzer zeichnen. Dies ermöglichte es mich dann über sie und Anzeige in einer WPF-Anwendung zu ziehen, um die Windows verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top