Форматирование строки для поля форматированного текста с постоянным и динамическим текстом

В настоящее время я пытаюсь создать словарь, который сопоставляет выбранный элемент с представлением списка с соответствующим строковым выводом в текстовом поле с расширенным форматированием. Я хотел бы выделить определенный текст в строке, который всегда будет одинаковым (постоянным), а также добавить динамический текст в строку, которая будет меняться.

Примерно так: ID: 8494903282

Где ID — это постоянный текст, который мне нужен, выделенный жирным шрифтом, а числа будут динамическим идентификатором, который меняется. Мне нужно будет иметь несколько строк с разными данными в этом формате, которые будут меняться:

ID: 8494903282

Имя: какое-то имя

Дата: 15 марта 2018 г.

В настоящее время у меня есть форматированное текстовое поле для вывода, и я пытаюсь использовать форматирование строк, чтобы делать то, что хочу, но это работает неправильно. По сути, мне нужно строковое значение, которое я могу сохранить в словаре, поэтому, когда элемент выбран, я могу просто установить для свойства rtf текстового поля значение этого элемента словаря.

Ниже у меня есть текущая строка формата, которую я пытаюсь установить для свойства rtf:

string s1 = string.Format(@"{{\rtf1\ansi \b Commit ID: \b0 {0}\line}}", entry.ID);
string s2 = string.Format(@"{{\b Author: \b0 {0}\line}}", entry.Author);
string s3 = string.Format(@"{{\b Date: \b0 {0}\line}}", entry.Date.ToString("d"));
string s4 = Environment.NewLine + Environment.NewLine + entry.Message;
contents = (s1 + s2 + s3 + s4);

Затем установите свойство rtf моего расширенного текстового поля:

LogContentsTB.Rtf = Logs[LogNamesLV.SelectedItems[0].Name];

Где logs — это словарь формы ‹ строка, строка >, который содержит строку формата для определенного элемента.

Однако я получаю следующий вывод вместо ожидаемого: введите здесь описание изображения

Это правильная форма вывода для первого элемента, но больше ничего не появляется. Если есть какие-либо другие способы сделать это, я открыт для предложений.


person Schwagmister    schedule 15.03.2018    source источник
comment
Вы уверены, что правильно ставите contents в Logs?   -  person Chetan Ranpariya    schedule 16.03.2018
comment
@ChetanRanpariya да, до того, как у меня было обычное текстовое поле, я выводил именно эту строку за вычетом форматирования и пытался выделить ее жирным шрифтом. Данные хорошие.   -  person Schwagmister    schedule 16.03.2018


Ответы (2)


Немного почитав синтаксис rtf, я заметил, что пытаюсь закрыть каждую строку фигурными скобками. Фигурные скобки используются для групп RTF. По какой-то причине форматированное текстовое поле в формах Windows не очень хорошо с этим сочеталось.

Еще одна вещь, которую следует отметить, это то, что метод string.format, вероятно, был основным виновником проблем с этим типом форматирования. В своем ответе я не использую его, а просто добавляю строку непосредственно в строку в формате rtf, то есть ‹ формат>‹ переменная строка>‹ конечный формат>

Если вы посмотрите на ответ NetMage, вы заметите, что он ставит открывающую скобку только на самую первую строку, s1. Это для группировки всей строки. Но нам нужно добавить закрывающую скобку к последней строке s4, чтобы завершить группировку. Ниже приведен окончательный код и снимок экрана, которые работали для моего приложения.

string s1 = @"{\rtf1\ansi\b ID: \b0 " + entry.ID + @" \line\line";
string s2 = @"\b Author: \b0 " + entry.Author + @" \line\line";
string s3 = @"\b Date: \b0 " + entry.Date.ToString("d") + @" \line\line ";
string s4 = entry.Message + @"}";
contents = s1 + s2 + s3 + s4;

введите здесь описание изображения

Спасибо, что указали мне правильное направление!

person Schwagmister    schedule 20.03.2018

Я думаю, что ваше форматирование RTF неверно. Вы можете попробовать:

string s1 = string.Format(@"{{\rtf1\ansi\r\b Commit ID:\b0 {0}\line\r", entry.ID);
string s2 = string.Format(@"\b Author: \b0 {0}\line\r", entry.Author);
string s3 = string.Format(@"\b Date: \b0 {0}\line\r", entry.Date.ToString("d"));
string s4 = Environment.NewLine + Environment.NewLine + entry.Message + "}}";
contents = (s1 + s2 + s3 + s4);
person NetMage    schedule 16.03.2018
comment
NetMage, я получаю исключение из-за того, что входная строка была в неправильном формате при внесении этих изменений. Любые идеи? - person Schwagmister; 20.03.2018
comment
Необходимо избежать фигурных скобок, чтобы можно было правильно определить заполнители формата. - person Joel Coehoorn; 20.03.2018
comment
Это звучит разумно. Сделанный. - person NetMage; 21.03.2018