wpf richtextbox в приложении winforms

Aug 20 2020

Я хотел бы использовать WPF RichTextBox в проекте WinForms, написанном на VB.
Я создал проект WinForms с одной формой и кнопкой.
Затем я добавил новый проект. Библиотека пользовательского управления WPF разместила WPF RichTextBox в форме WPF.
Я добавил возможность взаимодействия с ElementHost. WinForm с этим импортом

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

Отсюда я потерял некоторые из вопросов SO - от 10 до 7 лет, учебник MS не очень помогает
Код из формы WPF

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

Я не публиковал код XAML, НЕ уверен, как это сделать

Итак, вопрос, что делать дальше, чтобы связать форму WPF с RTB с формой WinForms?
Я хотел бы загрузить данные из базы данных SQLite в WPF RichTextBox и сохранить текст, введенный в RTB, в базу данных.

Ответы

1 James_Duh Aug 21 2020 at 04:01

Этот ответ предназначен для расширения замечательного ответа @KyleWang.
Одна БОЛЬШАЯ проблема с выбором векторов для WPF RichTextBox: Нет свойства Text в элементе управления WPF RichTextBox. Вот один из способов вывести весь текст. Тем не менее, я бы ИМХО предложил использовать элемент управления WPF Plain TextBox.
Вектор также прокомментировал, как скрыть HotReload в строке заголовка Инструменты> Параметры> Отладка> Общие> снимите флажок Включить инструменты отладки пользовательского интерфейса для
кода XAML OK Ниже надеюсь, что это полезно если вы решите использовать элемент управления WPF в WinForms для проверки орфографии

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

Чтобы разместить элемент управления WPF в Winforms, вы можете воспользоваться следующими двумя способами.

Во-первых, им обоим нужно добавить элемент ElementHostуправления в форму.

Решение А:

Непосредственно объявить элементы управления wpf (используя 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

Решение B:

Создайте новый User Control(WPF)и отредактируйте содержимое в «UserControl1.xaml» следующим образом.

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

Затем измените код в 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