如何在不使用XAML的情况下将换行符插入TextBlock?

7

我已经在代码中创建了一个WPF的TextBlock,并将其放置在一个Label(我的情况不允许使用XAML),如下所示:

Label l = new Label();
TextBlock tb = new TextBlock();
l.Content = tb;

我现在遇到这样一种情况:我需要设置包含换行符的TextBlock.Text属性,例如:

tb.Text = "Hello\nWould you please just work?";

我已经尝试了许多编码方式(如HTML编码、ASCII编码等)和不同的换行组合方式(回车、换行、回车加换行、换行加回车、双换行、双回车等等),但都没有成功。

  • 绝对不允许使用XAML
  • 假设原始对象是使用C#代码创建而不是XAML。
  • 答案不应该涉及WPF属性的绑定。没有使用绑定。"TextBlock"对象的"Text"属性正在设置。换行符必须在那里插入。

如果这是不可能的,请告诉我如何通过动态替换任意输入字符串中的每个换行符为一个LineBreak对象(或任何需要的对象)来以编程方式添加换行符。因为输入字符串将具有任意(可读文本)内容,我不能预先知道它们的内容,因为这些字符串是动态(用户定义的)。源字符串将具有换行符(也称为LF,也称为\n),但我可以轻松地将其替换为任何所需的字符。

此外,如果直接使用Label比在Label中的TextBlock更容易实现,那也很好 - 我可以使用它。我只需要一个具有自动普通文本换行的控件。


可能是具有换行符的编程TextBlock条目的重复问题,那里的第二个答案可能是您正在寻找的。 - GEEF
3个回答

22

你有几个选择:

使用Environment.NewLine属性:

TextBlock tb = new TextBlock();
tb.Text = "Hello" + Environment.NewLine + "Would you please just work?";

或者,手动将RunLineBreak添加到TextBlock中:
TextBlock tb = new TextBlock();
tb.Inlines.Add(new Run("Hello"));
tb.Inlines.Add(new LineBreak());
tb.Inlines.Add(new Run("Would you please just work?"));

1

再说一点小事。我遇到了类似的问题,并从资源文件中获取了字符串。我注意到,.NET将字符串"\r\n"作为"\\r\\n"传递。当我用普通反斜杠替换双反斜杠时,一切都按预期工作了。


0

您可以将字符串值存储在“Resources.resw”中,并直接在代码中获取它们。 在VS资源编辑器本身中无法向字符串值添加空行。要做到这一点,只需在任何文本编辑器中编辑值,添加所需的空行,然后将其“复制 -> 粘贴”到Visual Studio资源编辑器的Value列中。

例如:带有2个换行符的"Farewell"的值:Goodbye\n\nSave changes? - 在文本编辑器中看起来像这样(就是这样,需要复制到VS中):

Goodbye

Save changes?

enter image description here

要在C#代码中获取资源的字符串值,请根据您的应用程序调用以下行之一(UWP或WinUI3)。
UWP代码:
Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView().GetString("Farewell");

WinUI3 代码:

new ResourceLoader().GetString("Farewell");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接