wpf TextBlock 컨트롤에 새 줄을 넣는 방법은 무엇입니까?


102

XML 파일에서 텍스트를 가져오고 있으며 텍스트 블록 렌더링에서 새 줄로 해석되는 몇 가지 새 줄을 삽입하고 싶습니다.

난 노력 했어:

<data>Foo bar baz \n baz bar</data>

그러나 데이터는 새 줄없이 계속 표시됩니다. 나는의 내용을 설정 <data>비아 .TextC #을 통해 속성입니다.

GUI에서 새 줄을 렌더링하기 위해 XML에 무엇을 입력해야합니까?

XAML에서 텍스트를 수동으로 설정하는 것과 같은 것을 시도했습니다.

<TextBlock Margin="0 15 0 0" Width="600">
There &#10;
is a new line.
</TextBlock>

인코딩 된 문자는 GUI에 나타나지 않지만 새 줄도 제공하지 않습니다.


반환 문자를 "quotes"<data> Foo bar baz "\ n"baz bar </ data>로 감싸려고
했습니까?

@DJKRAZE : 따옴표는 아무것도하지 않고 r과 n도 함께하지 않습니다. : S
여기 만 볼리비아

@BalamBalam : 동일하지 않습니다. 그 질문은 Text 속성에 대해 명시 적입니다.
HB

나는 왜 ""가 지금 작동하지 않는지 완전히 이해하고있다. 나는 <LineBreak>가 문자 / 키워드에 더 가깝다고 가정하고있다. 내 실수 .. 그레이트 대답 HB
MethodMan

Dan Vogel은 최신 작업 솔루션을 만들었습니다. WPF는 \ r \ n을 \\ r \\ n으로 해석합니다.
zORg Alex

답변:


174

데이터에 새 줄을 입력 할 수 있습니다.

<data>Foo bar baz 
 baz bar</data>

작동하지 않으면 문자열을 수동으로 구문 분석해야 할 수 있습니다.

간단한 직접 XAML이 필요한 경우 :

<TextBlock>
    Lorem <LineBreak/>
    Ipsum
</TextBlock>

아니, 이것도 아무 일도하지 않습니다. 새 줄로 Enter 키를 눌러 TextBlock의 XAML 내부에 내용을 복사하여 붙여 넣어도 한 번에 표시합니다.
Only Bolivian Here

3
@SergioTapia : 일부 데이터 파일에 중단이있는 것과 XAML 사이에는 차이가 있지만 XAML 파서는 공백을 무시하지만 예를 들어 XmlSerializer중단을 사용하여 일부 XML을 역 직렬화 하면 유지됩니다. Xaml에서는 <LineBreak/>.
HB

데이터에 직접 새 줄을 넣으십시오 ... 물론! 여기서는 \ n, <LineBreak /> 및 수많은 html 코드를 시도하는 데 많은 시간을 보냈습니다. 가장 간단한 방법을 먼저 시도해야했습니다.
thehelix

65

완전성을 위해 : 다음을 수행 할 수도 있습니다.

 <TextBlock Text="Line1&#x0a;Line 2"/>

x0A는 이스케이프 된 16 진수 줄 바꿈입니다. \ n에 해당


2
다음과 같은 시나리오에서 바인딩에 유용합니다.-<TextBlock> <TextBlock.Text> <MultiBinding StringFormat = "{} Name : {0} & # x0a; Code : {1}"> <Binding Path = "Name"/ > <Binding Path = "Code"/> </ MultiBinding> </TextBlock.Text> </ TextBlock>
rajibdotnet

3
이것이 가장 좋은 대답입니다
Aurélio Antonio

이 링크를 추가합니다 : stackoverflow.com/questions/9021649/… 대답에 대한 설명.
I.Step

22

바인딩을 사용할 수도 있습니다.

<TextBlock Text="{Binding MyText}"/>

그리고 다음과 같이 MyText를 설정하십시오.

Public string MyText
{
    get{return string.Format("My Text \n Your Text");}
}

9
string.Format ()도 필요하지 않습니다. return "My Text \ n Your Text"; 잘 작동합니다.
Zodman

18

당신은 사용해야합니다

 < SomeObject xml:space="preserve" > once upon a time ...
      this line will be below the first one < /SomeObject>

또는 원하는 경우 :

 <SomeObject xml:space="preserve" />  once upon a time... &#10; this line below < / SomeObject>

조심하십시오 : 둘 다 & 10을 사용하고 텍스트의 다음 줄로 이동하면 두 개의 빈 줄이 생깁니다.

자세한 내용은 여기 : http://msdn.microsoft.com/en-us/library/ms788746.aspx


12

이것은 오래된 질문이지만 방금 문제를 발견하고 주어진 답변과 다르게 해결했습니다. 다른 사람들에게 도움이 될 수 있습니다.

내 XML 파일이 다음과 같음에도 불구하고 알아 차 렸습니다.

<tag>
 <subTag>content with newline.\r\nto display</subTag>
</tag>

내 C # 코드로 읽을 때 문자열에 이중 백 슬래시가 있습니다.

\\r\\n

이 문제를 해결하기 위해 추가 백 슬래시를 제거하는 ValueConverter를 작성했습니다.

public class XmlStringConverter : IValueConverter
{
    public object Convert(
        object value,
        Type targetType,
        object parameter,
        CultureInfo culture)
    {
        string valueAsString = value as string;
        if (string.IsNullOrEmpty(valueAsString))
        {
            return value;
        }

        valueAsString = valueAsString.Replace("\\r\\n", "\r\n");
        return valueAsString;
    }

    public object ConvertBack(
        object value,
        Type targetType,
        object parameter,
        CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

TextBlock의 XAML에 추가 TextWrapping="Wrap"(그리고 AcceptsReturn="True"이것이 TextBox 인 경우 )를 추가해야하는 것과 함께 올바른 선택이었고 이것이 답이되어야합니다.하지만 .Replace()데이터베이스에서 오는 값에 대해 말하면됩니다 . 멋진 기능 : valueAsString = valueAsString.Replace("\\r\\n", "\r\n"); Return 키를 사용하여 입력 한 모든 값은 DB에 잘 기록됩니다. 앞서 언급했듯이 C #에서 문제가 발생한 값을 표시하기 위해 해당 값을 확보 할 때입니다. 따라서 이것은 텍스트의 onload라고 불릴 필요가 있습니다.
vapcguy

10

다른 모든 것이 실패하면 다음을 사용할 수도 있습니다.

"My text needs a line break here" + System.Environment.NewLine + " This should be a new line"

8
<TextBlock Margin="4" TextWrapping="Wrap" FontFamily="Verdana" FontSize="12">
        <Run TextDecorations="StrikeThrough"> Run cannot contain inline</Run>
        <Span FontSize="16"> Span can contain Run or Span or whatever 
            <LineBreak />
        <Bold FontSize="22" FontFamily="Times New Roman" >Bold can contains 
            <Italic>Italic</Italic></Bold></Span>
</TextBlock>

1

System.Environment.NewLine을 사용하는 것이 나를 위해 일한 유일한 솔루션입니다. \ r \ n 시도했을 때 텍스트 상자에서 실제 \ r \ n을 반복했습니다.


0

텍스트 블록에이 옵션이 활성화되어 있는지 확인해야합니다.

AcceptsReturn="True"

AcceptsReturn는 텍스트 상자,하지 TextBlock을위한
스티브

0

다음과 같이 RichTextBox "rtb"에 "줄 바꿈"또는 "단락 나누기"를 삽입합니다.

var range = new TextRange(rtb.SelectionStart, rtb.Selection.End); 
range.Start.Paragraph.ContentStart.InsertLineBreak();
range.Start.Paragraph.ContentStart.InsertParagraphBreak();

NewLine 항목을 가져 오는 유일한 방법은 먼저 "\ r \ n"항목이있는 텍스트를 삽입 한 다음 Selection 및 / 또는 TextRange 개체에서 작동하는 더 많은 코드를 적용하는 것입니다. 이렇게하면 \ par 항목이 \ line 항목으로 변환되고 원하는대로 저장되며 * .Rtf 파일을 다시 열 때 여전히 올바른지 확인됩니다. 그것이 제가 지금까지 열심히 노력한 후에 발견 한 것입니다. 내 목적을 위해 성공적으로 수행 한 Lines 및 Breaks가 이동해야하는 TextPointer 항목 (.Start .End .ContentStart .ContentEnd)을 설정하려면 세 개의 코드 줄을 더 많은 코드 (루프 포함)로 둘러싸 야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.