我用剪贴板中的多行填充文本框,其中包含
\r\n
作为换行符(与 Environment.NewLine
相同。在我进行更改并想要获取文本后,我只得到 \r
作为换行符。是有什么办法可以改变这个吗?
我发现 UWPBox 可以帮助你。
UWPBox:https://github.com/ruffin--/UWPBox
正如作者所说:
让我强调第一个。即使 Environment.NewLine 是 , 你有 整个myTextBox.Text,如果你检查myTextBox.SelectedText,至少在Windows 10 for PC中,所有换行符都会变成 !!!这使得对 SelectedText 的更改真正古怪地集成到文本的上下文中。有关特定示例,请参阅StackOverflow 问题。
如果您尝试在 UWP (CS) Windows 10 应用程序中从 TextBox 读取行,请使用 " “ 只有,
string[] InputStringArray= InputTextBox.Text.Split("\r");
可以使用Join插入" “
string result = string.Join("\r\n", InputStringArray);
如果您想始终使用
\r\n
作为换行符,无论 TextBox.Text
是否为您提供 \r
或 \n
(如 Uno 平台中的 Android/iOS),请执行以下操作。
在您的 XAML 文件中,将转换器命名空间添加到顶级元素:
xmlns:converters="using:MyConverters"
将转换器作为静态资源添加到您的 XAML 文件中:
<Page.Resources>
<converters:LineEndingsConverter x:Key="LineEndingsConverter" />
</Page.Resources>
将
TextBox.Text
属性绑定到 ViewModel 中的属性,并使用 LineEndingsConverter
转换行尾:
<TextBox Text="{Binding SomeText, Converter={StaticResource LineEndingsConverter}, Mode=TwoWay}" />
#nullable enable
using System;
using Windows.UI.Xaml.Data;
namespace MyConverters
{
/// <summary>
/// Because TextBox returns text with '\r' for line breaks on UWP and '\n' on Xamarin instead of '\r\n', this converts them to '\r\n'
/// </summary>
public class LineEndingsConverter : IValueConverter
{
public object? Convert(object? value, Type targetType, object parameter, string language)
{
if (value is string input)
{
return MyHelpers.LineEndingsConverter.ConvertLineEndings(input);
}
return value;
}
public object? ConvertBack(object? value, Type targetType, object parameter, string language)
{
if (value is string input)
{
return MyHelpers.LineEndingsConverter.ConvertLineEndings(input);
}
return value;
}
}
}
#nullable enable
using System.Text;
namespace MyHelpers
{
public static class LineEndingsConverter
{
/// <summary>
/// Converts all "\r" and "\n" line breaks in a string to "\r\n", leaving existing "\r\n" line breaks unchanged.
/// </summary>
/// <param name="input">The input string to convert line breaks for.</param>
/// <returns>The input string with all "\r" and "\n" line breaks converted to "\r\n".</returns>
public static string? ConvertLineEndings(in string? input)
{
if (input is null or "")
{
return input;
}
var sb = new StringBuilder(input.Length);
bool previousWasCarriageReturn = false;
foreach (char c in input)
{
if (c == '\r')
{
if (previousWasCarriageReturn)
{
sb.Append(c);
previousWasCarriageReturn = false;
}
else
{
previousWasCarriageReturn = true;
}
}
else if (c == '\n')
{
if (previousWasCarriageReturn)
{
sb.Append("\r\n");
previousWasCarriageReturn = false;
}
else
{
sb.Append("\r\n");
}
}
else
{
if (previousWasCarriageReturn)
{
sb.Append("\r\n");
previousWasCarriageReturn = false;
}
sb.Append(c);
}
}
if (previousWasCarriageReturn)
{
sb.Append("\r\n");
}
return sb.ToString();
}
}
}
#nullable enable
using MyHelpers;
using FluentAssertions;
using Xunit;
namespace MyHelpers.Tests
{
public class LineEndingsConverterFixture
{
[Fact]
public void Given_NullInput_When_ConvertingLineEndings_Then_ReturnsNull()
{
// Given
string? input = null;
// When
var output = LineEndingsConverter.ConvertLineEndings(input);
// Then
output.Should().BeNull();
}
[Fact]
public void Given_EmptyInput_When_ConvertingLineEndings_Then_ReturnsEmptyString()
{
// Given
string? input = "";
// When
var output = LineEndingsConverter.ConvertLineEndings(input);
// Then
output.Should().Be("");
}
[Fact]
public void Given_InputWithOnlyCarriageReturn_When_ConvertingLineEndings_Then_ReturnsInputWithCarriageReturnAndLineFeed()
{
// Given
string? input = "Hello\rWorld\r";
// When
var output = LineEndingsConverter.ConvertLineEndings(input);
// Then
output.Should().Be("Hello\r\nWorld\r\n");
}
[Fact]
public void Given_InputWithOnlyNewline_When_ConvertingLineEndings_Then_ReturnsInputWithCarriageReturnAndLineFeed()
{
// Given
string? input = "Hello\nWorld\n";
// When
var output = LineEndingsConverter.ConvertLineEndings(input);
// Then
output.Should().Be("Hello\r\nWorld\r\n");
}
[Fact]
public void Given_InputWithMixedLineBreaks_When_ConvertingLineEndings_Then_ReturnsInputWithCarriageReturnAndLineFeed()
{
// Given
string? input = "Hello\r\nWorld\n";
// When
var output = LineEndingsConverter.ConvertLineEndings(input);
// Then
output.Should().Be("Hello\r\nWorld\r\n");
}
}
}