2015-12-18 1 views
4

При загрузке файла RTF в Windows Forms RichTextBox он теряет цвет фона ячеек таблицы. Если мы используем WPF RichTextBox и загружаем тот же файл, все отформатировано так, как должно.Windows.Forms.RichTextBox Lose table background colors

Я что-то упускаю, когда загружаю файл в Windows Forms RichTextBox?

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); 
      } 
     } 
    } 

В приведенном выше фрагменте кода я также попытался с помощью

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

и

richTextBox1.LoadFile(fDialog.FileName); 

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(); 
      } 
     } 

    } 

Вот снимок экрана с обеих версий: enter image description here

Заранее спасибо за любую помощь.

Steve.

+1

Спасибо за комментарии, фрагменты были взяты из быстрых тестовых проектов, которые я создал, чтобы мы могли исправить проблему в гораздо большей проекта, где мы используем заявления. – SteveP

ответ

4

Было много версий RichTextBox, Winforms были заблокированы в раннем выпуске версии 2.0. Возврат к .NET 1.x и .NET 2.0, версии, которые все еще могут работать в старых версиях Windows, например 98. Поддержка таблиц в версии 2.0 отсутствует.

Это в высшей степени фиксируемое, для обновления версии не требуется много кода. Версия 5.0 доступна на XP и выше. Все, что вам нужно сделать, это загрузить родную DLL, msftedit.dll вместо riched20.dll, чтобы стал доступен класс окон «RichEdit50W». И переопределите CreateParams для использования этого класса.

Добавить новый класс в ваш проект и вставить код, показанный ниже. Компиляция. Вы можете удалить новый элемент управления сверху панели инструментов, заменив старый.

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); 
} 

Образец таблицы я создал с слово, переведенное отлично:

enter image description here

+0

Привет, Ханс, большое спасибо за ваш ответ, он отлично работает – SteveP