Копирование текста из сетки в Редактор табличные текстовые столбцы не сохраняются
Пользователь сталкивается с проблемой копирования текста из сетки моего приложения в другой текстовый редактор приложения (если быть точным - приложение на принимающем сайте-Bloomberg IB Chat) - текстовые столбцы не выровнены должным образом.
Вы можете увидеть мой код - это работает на простых текстовых редакторах, таких как notepad, notepad++. Я думаю, что это работает, потому что блокнот-это моно-редактор шрифтов, каждая ширина символа одинакова. Например, когда я копирую текст в Word, текст не отображается правильно выровненным, как это было в моем приложении grid. То же самое происходит, когда я копирую текст в чат IB в Bloomberg.
Код прилагается, я вызываю метод FormatFromClipBoard (), когда пользователь нажимает ctrl+C. Пожалуйста помочь.
Что я уже пробовал:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Windows; namespace Utils { public class CopyFormatter { Literal [][] matrix; public void FormatFromClipBoard() { try { string clipboardText = Clipboard.GetText(TextDataFormat.Text); BuildMatrx(clipboardText); CalculateTabs(); string sReformatedText = ReformatText(); Clipboard.SetText(sReformatedText); } catch( Exception e) { } } private string ReformatText() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < matrix.Length; i++) { for (int j = 0; j < matrix[0].Length; j++) { sb.Append(matrix[i][j].StringWithTabs()); } sb.AppendLine(); } return sb.ToString(); } private void CalculateTabs() { for (int j = 0; j < matrix[0].Length; j++) { //scan vertically all first elements, all second elements to get longest token for each column ReferenceInt maxChars = new ReferenceInt(); for (int i = 0; i < matrix.Length; i++) { maxChars.LocalInt = maxChars.LocalInt > matrix[i][j].Length ? maxChars.LocalInt : matrix[i][j].Length; maxChars.ContainsPeriod = matrix[i][j].text.Contains('.') ? true : maxChars.ContainsPeriod; matrix[i][j].MaxCharCount = maxChars; } } } private void BuildMatrx(string clipboardText) { string[] arr = clipboardText.Split(new string[] { "\r\n" }, StringSplitOptions.None); if (arr != null && arr.Length > 0) { //number of lines matrix = new Literal[arr.Length][]; List<string[]> lst = new List<string[]>(); int maxlen = 0; Array.ForEach(arr, line => { string[] l = line.Split(new char[] { '\t' }, StringSplitOptions.None); lst.Add(l); maxlen = l.Length > maxlen ? l.Length : maxlen; }); if (maxlen > 0) { int i = 0; lst.ForEach(line => { matrix[i] = new Literal[maxlen]; int j = 0; Array.ForEach(line, token => { matrix[i][j++] = new Literal(token); }); for(; j < maxlen; j++) { matrix[i][j] = new Literal(string.Empty); } i++; }); } } } } private class Literal { public Literal(string token) { text = token; } public string text { get; set; } = string.Empty; public int Length { get { return text.Length; } } public ReferenceInt MaxCharCount { get; set; } public string StringWithTabs() { int tabSize = 5; int numberOfFlights = MaxCharCount.LocalInt / tabSize; int currWordFlights = Length / tabSize; int totalTabs = numberOfFlights - currWordFlights + 1; string s = new String('\t', totalTabs); return text + s; } } private class ReferenceInt { public int LocalInt { get; set; } = 0; } }