wpf richtextbox en la aplicación winforms

Aug 20 2020

Me gustaría utilizar un WPF RichTextBox en un WinForms proyecto escrito con VB
que han creado los WinForms proyecto con una forma y un botón
Luego añade un nuevo usuario de WPF proyecto de biblioteca de controles colocó una WPF RichTextBox en el WPF formar
añadí ElementHost interoperabilidad de el WinForm con estas importaciones

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

Desde aquí, estoy perdido, algunas de las preguntas SO tienen entre 10 y 7 años, el tutorial de MS no es de mucha ayuda
Código del formulario WPF

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

No publiqué el código XAML NO estoy seguro de cómo hacerlo

Entonces, ¿la pregunta qué hacer a continuación para vincular el formulario WPF con el RTB al formulario WinForms?
Me gustaría cargar datos de una base de datos SQLite en WPF RichTextBox y guardar el texto ingresado en el RTB en la base de datos

Respuestas

1 James_Duh Aug 21 2020 at 04:01

Esta respuesta está destinada a ampliar la maravillosa respuesta de @KyleWang.
Un GRAN problema con la elección de Vectores de WPF RichTextBox es No hay propiedad de texto en el control WPF RichTextBox. Esta es una forma de sacar todo el texto. Dicho esto me gustaría en mi humilde opinión se recomienda usar el control WPF Llanura cuadro de texto
vector también comentó sobre cómo ocultar el HotReload en las herramientas de la barra de título> Opciones> Depuración> General> Elimina la marca de Activar herramientas de interfaz de usuario de depuración para XAML
Código OK A continuación esperanza que esto sea útil si decide utilizar un control WPF en WinForms para la revisión ortográfica

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

Para alojar un control WPF en Winforms, puede consultar las dos formas siguientes.

Primero, ambos necesitan agregar un ElementHostcontrol al formulario.

Solución A:

Declare directamente los controles wpf (usando 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

Solución B:

Cree un nuevo User Control(WPF)y edite el contenido en "UserControl1.xaml" de la siguiente manera.

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

Luego modifique el código en '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