具有常量和动态文本的富文本框的字符串格式

String formatting for rich text box with constant and dynamic text

目前我正在尝试创建一个字典,该字典将所选项目映射到列表视图中,并在富文本框中输出相应的字符串。我想将字符串中的特定文本加粗,这些文本将始终相同(常量),并将动态文本添加到会更改的字符串中。

像这样: ID:8494903282

其中 ID 是我需要加粗的常量文本,数字是一个动态 ID,可以更改。我将需要多行包含这种格式的不同数据,这些格式会发生变化:

ID:8494903282

姓名:一些姓名

日期:2018 年 3 月 15 日

目前我有一个要输出到的富文本框,我正在尝试使用一些字符串格式来执行我想要的操作,但这无法正常工作。本质上,我需要一个可以存储在字典中的字符串值,这样当一个项目被选中时,我可以将文本框的 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 是 形式的字典,其中包含特定项目的格式字符串。

但是,我得到以下输出而不是我预期的输出:

这是第一项的正确输出形式,但没有其他内容出现。如果有任何其他方法可以做到这一点,我愿意接受建议。

我认为您的 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);

在简单阅读了 rtf 语法后,我注意到我试图用大括号结束每个字符串。大括号用于 RTF 组。出于某种原因,windows 表单中的富文本框不能很好地处理它。

另一件需要注意的事情是 string.format 方法可能是导致此类格式问题的主要原因。在我的回答中,我没有使用它,而是直接将字符串添加到 rtf 格式的字符串中,即 < format >< variable string > < ending format >

如果您查看 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;

感谢您为我指明正确的方向!