Windows.Forms.RichTextBox Kehilangan warna latar belakang tabel

Saat memuat file rtf ke dalam Windows Forms RichTextBox, warna latar belakang sel tabel akan hilang. Jika kita menggunakan WPF RichTextBox dan memuat file yang sama, semuanya akan diformat sebagaimana mestinya.

Apakah saya melewatkan sesuatu saat memuat file ke dalam Windows Forms RichTextBox?

Cuplikan kode RichTextBox Windows Forms:

    private void button1_Click(object sender, EventArgs e)
    {
        OpenFileDialog fDialog = new System.Windows.Forms.OpenFileDialog();
        fDialog.Filter = "Rich Text Files (*.rtf)|*.rtf";
        fDialog.Multiselect = false;
        fDialog.RestoreDirectory = true;
        if (fDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            if (fDialog.FileName != "")
            {
                richTextBox1.LoadFile(fDialog.FileName, RichTextBoxStreamType.RichText );
            }
        }
    }

Pada cuplikan kode di atas saya juga sudah mencoba menggunakan

richTextBox1.Rtf = File.ReadAllText(fDialog.FileName);

Dan

richTextBox1.LoadFile(fDialog.FileName);

Cuplikan kode WPF RichTextBox

    private void load_file_Click(object sender, RoutedEventArgs e)
    {
        System.Windows.Forms.OpenFileDialog fDialog = new System.Windows.Forms.OpenFileDialog();
        fDialog.Filter = "Rich Text Files (*.rtf)|*.rtf";
        fDialog.Multiselect = false;
        fDialog.RestoreDirectory = true;
        if (fDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            if (fDialog.FileName != "")
            {
                FileStream fStream;
                fStream = new FileStream(fDialog.FileName, FileMode.Open, FileAccess.Read, FileShare.Read);

                richtextbox1.SelectAll();
                richtextbox1.Selection.Load(fStream, DataFormats.Rtf);
                fStream.Close();
            }
        }

    }

Berikut cuplikan layar dari kedua versi: masukkan deskripsi gambar di sini

Terima kasih sebelumnya atas bantuan apa pun.

Steve.


person SteveP    schedule 18.12.2015    source sumber
comment
Terima kasih atas komentarnya, cuplikan diambil dari proyek pengujian cepat yang saya buat sehingga kami dapat memperbaiki masalah dalam proyek yang jauh lebih besar, di mana kami menggunakan pernyataan penggunaan.   -  person SteveP    schedule 18.12.2015


Jawaban (1)


Ada banyak versi RichTextBox, Winforms terkunci pada rilis awal, versi 2.0. Kembali ke .NET 1.x dan .NET 2.0, versi yang masih dapat berjalan pada versi Windows kuno seperti 98. Dukungan untuk tabel di v2.0 kurang.

Itu benar-benar dapat diperbaiki, tidak perlu banyak kode untuk mengupgrade versinya. Versi 5.0 tersedia di XP dan lebih tinggi. Yang harus Anda lakukan adalah memuat DLL asli, msftedit.dll, bukan riched20.dll, sehingga kelas jendela "RichEdit50W" tersedia. Dan ganti CreateParams untuk menggunakan kelas itu.

Tambahkan kelas baru ke proyek Anda dan tempelkan kode yang ditunjukkan di bawah ini. Menyusun. Anda dapat melepaskan kontrol baru dari atas kotak peralatan, menggantikan kontrol lama.

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;

public class RichTextBox5 : RichTextBox {
    protected override CreateParams CreateParams {
        get {
            if (moduleHandle == IntPtr.Zero) {
                moduleHandle = LoadLibrary("msftedit.dll");
                if ((long)moduleHandle < 0x20) throw new Win32Exception(Marshal.GetLastWin32Error(), "Could not load Msftedit.dll");
            }
            var cp = base.CreateParams;
            cp.ClassName = "RichEdit50W";
            return cp;
        }
    }
    private static IntPtr moduleHandle;

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr LoadLibrary(string lpFileName);
}

Contoh tabel yang saya buat dengan Word ditampilkan dengan sempurna:

masukkan deskripsi gambar di sini


PEMBARUAN: kode ini sekarang dibuat -di ke Winforms, targetkan setidaknya versi 4.7 untuk memanfaatkannya.

person Hans Passant    schedule 18.12.2015
comment
Hai Hans, terima kasih banyak atas jawaban Anda, ini berfungsi dengan baik - person SteveP; 18.12.2015
comment
Saya menemui masalah ketika gambar yang ditempel dari Word/Excel/.. di Windows 10 muncul sebagai gambar putih. Saya mencobanya, sepertinya berfungsi dengan baik. Terima kasih. - person okud; 25.06.2019
comment
Jadi sesekali seseorang di Microsoft masih melakukan update ke WinForms. WinForms sudah mati, umur panjang WinForms! - person LarsTech; 27.06.2019
comment
Terima kasih banyak atas solusi ini. Ini berfungsi dengan baik dan juga memecahkan masalah hilangnya gambar jpeg dan png (mis. \pict\jpegblip). - person WarpEnterprises; 28.07.2020