wpf richtextbox trong ứng dụng winforms

Aug 20 2020

Tôi muốn sử dụng WPF RichTextBox trong dự án WinForms được viết bằng VB
Tôi đã tạo dự án WinForms với một biểu mẫu và một nút
. Sau đó, tôi đã thêm một dự án mới Thư viện điều khiển người dùng WPF đã đặt một WPF RichTextBox trên biểu mẫu WPF.
Tôi đã thêm khả năng tương tác ElementHost vào WinForm với những Nhập này

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

Từ đây tôi bị mất một số câu hỏi SO là 10 đến 7 tuổi, hướng dẫn MS không giúp được nhiều
Mã từ WPF Form

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

Tôi đã không đăng mã XAML KHÔNG chắc chắn cách thực hiện điều đó

Vì vậy, câu hỏi phải làm gì tiếp theo để liên kết biểu mẫu WPF với RTB thành biểu mẫu WinForms?
Tôi muốn tải dữ liệu từ SQLite DB vào WPF RichTextBox và lưu văn bản đã nhập trong RTB vào DB

Trả lời

1 James_Duh Aug 21 2020 at 04:01

Câu trả lời này có nghĩa là để mở rộng câu trả lời tuyệt vời của @KyleWang
Một vấn đề LỚN với lựa chọn Vectors của WPF RichTextBox là Không có thuộc tính Văn bản trong điều khiển WPF RichTextBox. Đây là một cách để lấy tất cả văn bản ra. Điều đó nói rằng tôi sẽ IMHO đề xuất sử dụng WPF Plain TextBox Control
Vector cũng đã nhận xét về cách ẩn HotReload trong thanh tiêu đề Công cụ> Tùy chọn> Gỡ lỗi> Chung> bỏ chọn Bật công cụ gỡ lỗi giao diện người dùng cho XAML
Mã OK Dưới đây hy vọng điều này hữu ích nếu bạn quyết định sử dụng điều khiển WPF trong WinForms để kiểm tra chính tả

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

Để lưu trữ một điều khiển WPF trong Winforms, bạn có thể tham khảo hai cách sau.

Đầu tiên, cả hai đều cần thêm một ElementHostđiều khiển vào biểu mẫu.

Giải pháp A:

Khai báo trực tiếp các điều khiển wpf (sử dụng 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

Giải pháp B:

Tạo mới User Control(WPF)và chỉnh sửa nội dung trong "UserControl1.xaml" như sau.

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

Sau đó sửa đổi mã trong '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