wpf richtextbox nell'applicazione winforms

Aug 20 2020

Vorrei utilizzare un WPF RichTextBox in un progetto WinForms scritto con VB
Ho creato il progetto WinForms con un form e un pulsante
Ho quindi aggiunto un nuovo progetto WPF User Control Library ha posizionato un WPF RichTextBox sul modulo WPF a cui
ho aggiunto l'interoperabilità ElementHost il WinForm con queste importazioni

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

Da qui mi sono perso alcune delle domande SO hanno dai 10 ai 7 anni il tutorial MS non è di grande aiuto
Codice dal modulo WPF

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

Non ho pubblicato il codice XAML NON sono sicuro di come farlo

Quindi la domanda su cosa fare dopo per collegare il modulo WPF con l'RTB al modulo WinForms?
Vorrei caricare i dati da un DB SQLite nel RichTextBox di WPF e salvare il testo inserito nella RTB nel DB

Risposte

1 James_Duh Aug 21 2020 at 04:01

Questa risposta ha lo scopo di espandere la meravigliosa risposta di @KyleWang
Un GRANDE problema con la scelta dei vettori del RichTextBox di WPF è che non esiste una proprietà Text nel controllo RichTextBox di WPF. Ecco un modo per ottenere tutto il testo. Detto questo, IMHO suggerirei di utilizzare il controllo WPF Plain TextBox. Il
vettore ha anche commentato come nascondere HotReload nella barra del titolo Strumenti> Opzioni> Debug> Generale> deselezionare Abilita strumenti di debug dell'interfaccia utente per XAML
Codice OK Di seguito spero che questo sia utile se decidi di utilizzare un controllo WPF in WinForms per il controllo ortografico

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

Per ospitare un controllo WPF in Winforms, è possibile fare riferimento ai due modi seguenti.

Innanzitutto, entrambi devono aggiungere un ElementHostcontrollo nel modulo.

Soluzione A:

Dichiarare direttamente i controlli wpf (utilizzando 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

Soluzione B:

Creane uno nuovo User Control(WPF)e modifica il contenuto in "UserControl1.xaml" come segue.

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

Quindi modificare il codice 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