wpf richtextbox no aplicativo winforms

Aug 20 2020

Eu gostaria de usar um WPF RichTextBox em um projeto WinForms escrito com VB
Eu criei o projeto WinForms com um formulário e um botão e
, em seguida, adicionei um novo projeto WPF User Control Library colocado um WPF RichTextBox no formulário WPF
adicionei a interoperabilidade ElementHost a o WinForm com essas importações

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

A partir daqui estou perdido algumas das perguntas do SO são de 10 a 7 anos de idade o tutorial do MS não ajuda muito
Código do formulário WPF

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

Eu não postei o código XAML, NÃO tenho certeza de como fazer isso

Portanto, a pergunta que fazer a seguir para vincular o formulário WPF ao RTB ao formulário WinForms?
Gostaria de carregar dados de um banco de dados SQLite no WPF RichTextBox e salvar o texto inserido no RTB no banco de dados

Respostas

1 James_Duh Aug 21 2020 at 04:01

Esta resposta pretende expandir a resposta maravilhosa do @KyleWang.
Um GRANDE problema com a escolha de vetores do WPF RichTextBox é Não há propriedade Text no controle WPF RichTextBox. Aqui está uma maneira de retirar todo o texto. Dito isso, a IMHO sugeriria o uso do controle WPF Plain TextBox
Vector também comentou sobre como ocultar o HotReload na barra de título Ferramentas> Opções> Depuração> Geral> desmarque Habilitar ferramentas de depuração da interface do usuário para o
código XAML OK Abaixo espero que seja útil se você decidir usar um controle WPF em WinForms para verificação 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 hospedar um controle WPF no WinForms, você pode consultar as duas maneiras a seguir.

Primeiro, ambos precisam adicionar um ElementHostcontrole ao formulário.

Solução A:

Declarar diretamente os 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

Solução B:

Crie um novo User Control(WPF)e edite o conteúdo em "UserControl1.xaml" da seguinte maneira.

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

Em seguida, modifique o código em '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