wpf richtextbox w aplikacji winforms

Aug 20 2020

Chciałbym użyć WPF RichTextBox w projekcie WinForms napisanym za pomocą VB
Utworzyłem projekt WinForms z jednym formularzem i przyciskiem
Następnie dodałem nowy projekt Biblioteka kontroli użytkownika WPF umieściła WPF RichTextBox na formularzu WPF
Dodałem współdziałanie ElementHost do WinForm z tymi importami

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

Stąd zagubiłem niektóre pytania SO mają od 10 do 7 lat samouczek MS nie jest zbyt pomocny
Kod z formularza WPF

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

Nie wysłałem kodu XAML NIE wiem, jak to zrobić

Więc pytanie, co zrobić dalej, aby połączyć formularz WPF z RTB do formularza WinForms?
Chciałbym załadować dane z SQLite DB do WPF RichTextBox i zapisać tekst wprowadzony w RTB do DB

Odpowiedzi

1 James_Duh Aug 21 2020 at 04:01

Ta odpowiedź ma na celu rozwinięcie @KyleWang wspaniałej odpowiedzi
Jeden DUŻY problem z wyborem wektorów WPF RichTextBox jest taki, że w kontrolce WPF RichTextBox nie ma właściwości Text. Oto jeden sposób na wyciągnięcie całego tekstu. To powiedziawszy, sugerowałbym IMHO użycie kontrolki WPF Plain TextBox
Vector również skomentował, jak ukryć HotReload na pasku tytułu Narzędzia> Opcje> Debugowanie> Ogólne> odznacz Włącz narzędzia debugowania interfejsu użytkownika dla
kodu XAML OK Poniżej mam nadzieję, że to jest pomocne jeśli zdecydujesz się użyć kontrolki WPF w WinForms do sprawdzania pisowni

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

Aby hostować formant WPF w Winforms, możesz skorzystać z następujących dwóch sposobów.

Najpierw obaj muszą dodać ElementHostkontrolkę do formularza.

Rozwiązanie A:

Bezpośrednio zadeklaruj kontrolki WPF (używając 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

Rozwiązanie B:

Utwórz nową User Control(WPF)i edytuj zawartość w „UserControl1.xaml” w następujący sposób.

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

Następnie zmodyfikuj kod w „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