UWP 文本框放置 只有 - 如何设置 LineBreak

问题描述 投票:0回答:3

我用剪贴板中的多行填充文本框,其中包含

\r\n
作为换行符(与
Environment.NewLine
相同。在我进行更改并想要获取文本后,我只得到
\r
作为换行符。是有什么办法可以改变这个吗?

c# xaml textbox uwp
3个回答
5
投票

我发现 UWPBox 可以帮助你。

UWPBox:https://github.com/ruffin--/UWPBox

正如作者所说:

让我强调第一个。即使 Environment.NewLine 是 , 你有 整个myTextBox.Text,如果你检查myTextBox.SelectedText,至少在Windows 10 for PC中,所有换行符都会变成 !!!这使得对 SelectedText 的更改真正古怪地集成到文本的上下文中。有关特定示例,请参阅StackOverflow 问题。


0
投票

如果您尝试在 UWP (CS) Windows 10 应用程序中从 TextBox 读取行,请使用 " “ 只有,

 string[] InputStringArray= InputTextBox.Text.Split("\r");

可以使用Join插入" “

string result = string.Join("\r\n", InputStringArray);

0
投票

如果您想始终使用

\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");
        }
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.