wpf richtextbox in winforms anwendung

Aug 20 2020

Ich möchte eine WPF-RichTextBox in einem mit VB geschriebenen WinForms-Projekt verwenden.
Ich habe das WinForms-Projekt mit einem Formular und einer Schaltfläche erstellt.
Anschließend habe ich ein neues Projekt hinzugefügt. Die WPF-Benutzersteuerungsbibliothek hat eine WPF-RichTextBox in das WPF-Formular eingefügt, zu dem
ich die ElementHost-Interoperabilität hinzugefügt habe die WinForm mit diesen Importen

Imports System
Imports System.Windows.Forms
Imports System.Windows.Forms.Integration

Von hier bin ich verloren, einige der SO-Fragen sind 10 bis 7 Jahre alt. Das MS-Tutorial ist keine große Hilfe.
Code aus WPF Form

Public Class UserControl1
  ReadOnly rtbWPF As New UserControl
  ElementHost
  wpfwindow.Show
End Class

Ich habe den XAML-Code nicht veröffentlicht. Ich bin mir nicht sicher, wie ich das machen soll

Die Frage, was als nächstes zu tun ist, um das WPF-Formular mit dem RTB mit dem WinForms-Formular zu verknüpfen?
Ich möchte Daten aus einer SQLite-Datenbank in die WPF RichTextBox laden und den im RTB eingegebenen Text in der Datenbank speichern

Antworten

1 James_Duh Aug 21 2020 at 04:01

Diese Antwort soll die wunderbare Antwort von @KyleWang erweitern.
Ein großes Problem bei der Auswahl von Vektoren für die WPF RichTextBox ist, dass das WPF RichTextBox-Steuerelement keine Text-Eigenschaft enthält. Hier ist eine Möglichkeit, den gesamten Text herauszuholen. Das heißt, ich würde meiner Meinung nach vorschlagen, das WPF Plain TextBox-Steuerelement zu verwenden.
Vector kommentierte auch, wie das HotReload in der Titelleiste ausgeblendet wird. Extras> Optionen> Debugging> Allgemein> Deaktivieren Sie UI-Debugging-Tools für XAML aktivieren.
OK Code Unten hoffe, dass dies hilfreich ist Wenn Sie ein WPF-Steuerelement in WinForms zur Rechtschreibprüfung verwenden möchten

Public Class frmStart

Dim rtb As Windows.Controls.RichTextBox = New Windows.Controls.RichTextBox()
Dim tb As Windows.Controls.TextBox = New Windows.Controls.TextBox()
Dim str As String = " "

Private Sub frmStart_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ElementHost1.Child = rtb
    rtb.SpellCheck.IsEnabled = True

    ElementHost2.Child = tb
    tb.SpellCheck.IsEnabled = True

    If str.Length < 100 Then
        rtb.VerticalScrollBarVisibility = Windows.Controls.ScrollBarVisibility.Visible
    End If
End Sub

Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
    str = "Plain WPF TxtBox"
    tb.Text = str
    rtb.AppendText("Heree is som mispelled txt se if the dictioary wrks more nonsense to see the scroll bar's will this word wrapp or is that rapp")
End Sub

Private Sub btnGet_Click(sender As Object, e As EventArgs) Handles btnGet.Click
    Dim elementHost = ElementHost1
    Dim wpfRichText = CType(elementHost.Child, Windows.Controls.RichTextBox)
    Dim range As Windows.Documents.TextRange = New Windows.Documents.TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd)
    Dim allText As String = range.Text
    tbMsg.Text = allText.ToString
End Sub

Private Sub btnGTB_Click(sender As Object, e As EventArgs) Handles btnGTB.Click
    Dim elementHost = ElementHost2
    Dim text = tb.Text
    tbMsg.Text = text.ToString
End Sub
1 KyleWang Aug 20 2020 at 09:25

Um ein WPF-Steuerelement in Winforms zu hosten, haben Sie folgende Möglichkeiten.

Zunächst müssen beide ein ElementHostSteuerelement in die Form einfügen.

Lösung A:

Deklarieren Sie die wpf-Steuerelemente direkt (mit Windows.Controls).

Dim rtb As Windows.Controls.RichTextBox = New Windows.Controls.RichTextBox()
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    rtb.SpellCheck.IsEnabled = True
    ElementHost1.Child = rtb
End Sub

Lösung B:

Erstellen Sie eine neue User Control(WPF)und bearbeiten Sie den Inhalt in "UserControl1.xaml" wie folgt.

<Grid>
    <RichTextBox x:Name="richtextbox" Foreground="Black" FontSize="24" Margin="0"></RichTextBox>
    <RichTextBox SpellCheck.IsEnabled="True" />
</Grid>

Ändern Sie dann den Code in 'form1.vb'

Private uc As UserControl1 = New UserControl1()
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ElementHost1.Child = uc
End Sub