wpf richtextbox dans l'application winforms

Aug 20 2020

Je voudrais utiliser un WPF RichTextBox dans un projet WinForms écrit avec VB
J'ai créé le projet WinForms avec un formulaire et un bouton
J'ai ensuite ajouté un nouveau projet WPF User Control Library a placé un WPF RichTextBox sur le formulaire WPF
J'ai ajouté l'interopérabilité ElementHost à le WinForm avec ces importations

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

À partir de là, je suis perdu certaines des questions SO ont 10 à 7 ans, le didacticiel MS n'est pas beaucoup d'aide
Code de WPF Form

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

Je n'ai pas publié le code XAML PAS sûr de savoir comment faire cela

Donc, la question que faire ensuite pour lier le formulaire WPF avec le RTB au formulaire WinForms?
Je voudrais charger des données d'une base de données SQLite dans la WPF RichTextBox et enregistrer le texte entré dans le RTB dans la base de données

Réponses

1 James_Duh Aug 21 2020 at 04:01

Cette réponse est destinée à développer la merveilleuse réponse @KyleWang
Un gros problème avec le choix des vecteurs de WPF RichTextBox est qu'il n'y a pas de propriété Text dans le contrôle WPF RichTextBox. Voici une façon de sortir tout le texte. Cela dit, je voudrais à mon humble avis suggérer d'utiliser le
vecteur de contrôle WPF Plain TextBox et comment masquer le HotReload dans la barre de titre Outils> Options> Débogage> Général> décocher Activer les outils de débogage de l'interface utilisateur pour XAML
Code OK Ci-dessous espérons que cela est utile si vous décidez d'utiliser un contrôle WPF dans WinForms pour la vérification orthographique

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

Pour héberger un contrôle WPF dans Winforms, vous pouvez vous référer aux deux méthodes suivantes.

Tout d'abord, les deux doivent ajouter un ElementHostcontrôle dans le formulaire.

Solution A:

Déclarez directement les contrôles wpf (à l'aide de 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

Solution B:

Créez un nouveau User Control(WPF)et modifiez le contenu dans "UserControl1.xaml" comme suit.

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

Puis modifiez le code dans '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