문자열 속성의 개행


283

속성으로 설정 될 때 텍스트에 줄 바꿈을 추가하려면 어떻게해야합니까?

<TextBlock Text="Stuff on line1 \n Stuff on line2" />

분해 형식으로 나누는 것은 특정 상황에 대한 옵션이 아닙니다. 내가 필요한 것은 다음을 에뮬레이트하는 방법입니다.

<TextBlock>
  <TextBlock.Text>
    Stuff on line1 <LineBreak/>
    Stuff on line2
  </TextBlock.Text>
<TextBlock/>

답변:


553
<TextBlock Text="Stuff on line1&#x0a;Stuff on line 2"/>

16 진수로 인코딩 된 값을 사용하여 리터럴을 나타낼 수 있습니다. 이 경우 줄 바꿈 (char 10)을 사용했습니다. 당신은 "고전적인"하고 싶은 경우 vbCrLf에, 당신은 사용할 수 있습니다&#x0d;&#x0a;

그건 그렇고, 구문은 앰퍼샌드, 파운드, 문자 x , 원하는 문자의 16 진수 값, 마지막으로 세미콜론입니다.

또한 완전성을 위해 코드 뒤에 상수 또는 런타임에 구성된 변수처럼 이미 줄 바꿈이 포함 된 텍스트에 바인딩 할 수 있습니다.


14
분명히 이것은 <TextBlock.Text> </ TextBlock.Text> 태그 내에서 작동하지 않습니다.
tcables

45
오늘 까지이 답변에 대해 34 건의 의견을 발표했으며 구문이 너무 구식이기 때문에 다시 돌아와 확인해야했습니다.
밥 킹

3
물론. 이 북마크가 있습니다. 나는 항상 그것을 확인해야합니다.
MojoFilter

4
'Archaic'==> 'Arcane':-)
Will Dean

5
심지어 같은 백 슬래시 추가 바인딩 매개 변수 내에서 작동 : ConverterParameter를 = '테스트 \ & #의 X0A, 텍스트'
스벤

72

소스 XAML에서 공백을 유지하기 위해 xml : space = "preserve"속성을 사용할 수 있습니다.

<TextBlock xml:space="preserve">
Stuff on line 1
Stuff on line 2
</TextBlock>

8
xml : space = "preserve"를 제거하고 줄 사이에 <LineBreak />를 추가 할 수도 있습니다
usefulBee

5
xml:space="preserve"들여 쓰기 공간을 유지 한다는 점에 유의해야합니다 (몇 년 후) . 일반적으로 XAML에있는 들여 쓰기 공간을 유지합니다. 따라서 <LineBreak />위에서 제안한 명시 적 솔루션은 더 깨끗한 솔루션 인 것 같습니다.
Zeus

감사! 이 솔루션은 XAML 기반 직렬화 코드에 매우 적합했습니다.
Seraphim

아 이것은 완벽하게 작동했습니다. 보일러 플레이트 코드가 너무 많이 절약되었습니다. 감사합니다
iam.Carrot

57

사용해야합니다 (자원에 예) 당신은 문자열을해야 할 때 xml:space="preserve" 앰퍼샌드 문자 코드 :

<System:String x:Key="TwoLiner" xml:space="preserve">First line&#10;Second line</System:String>

또는 텍스트의 리터럴 줄 바꿈 :

<System:String x:Key="TwoLiner" xml:space="preserve">First line 
Second line</System:String>

경고 : 당신이 두 번째 예제와 같은 코드를 작성하는 경우, 당신은 삽입 한 운영 체제 및 / 또는 텍스트 편집기를 사용하여 라인 엔딩에 따라, 줄 바꿈 또는 캐리지 리턴과 줄 바꿈. 예를 들어 Linux 시스템에서 git로 작성하고 커밋하면 모든 것이 잘 보일 수 있지만 누군가 Windows로 복제하면 git은 줄 끝을\r\n 문자열에 따라 ... 세상을 깰 수도 있습니다.

공백을 보존 할 때주의하십시오. 다음과 같이 쓰면 :

<System:String x:Key="TwoLiner" xml:space="preserve">
First line 
Second line 
</System:String>

실제로 4 개의 줄 바꿈, 4 개의 캐리지 리턴 및 잠재적으로 보이지 않는 공백을 추가했습니다.


10
BTW에서는 xml:space="preserve"속성도 적용 할 수 ResourceDictionary있으므로 모든 리소스 문자열에 속성 을 적용 할 필요는 없습니다.
ocodo

1
앰퍼샌드 없이도 작동합니다. 이와 같은 것 : <System:String x:Key="TwoLiner" xml:space="preserve">First line Second line</System:String> (첫 번째 줄과 두 번째 줄 사이에 줄 바꿈)
vgaltes

1
내가 당신에게 +10을 줄 수 있기를 바랍니다xml:space="preserve"
TimothyP

1
@trooper 방금 편집을했고 Jaykul / mod의 승인을 받았습니다. Jaykul의 추가 빌드는 여기에서 사소한 세부 사항을 명확히했습니다 (내 편집이 원하는대로 원하는 결과를 얻지 못했기 때문에). 전반적 으로이 상호 작용은 내 자신을 게시하는 것보다 더 나은 답변을 만드는 데 도움이됩니다.
Anthony Lusardi

21

<TextBlock.Text>다음과 같이 컨텐츠를 제거 하고 추가하기 만하면됩니다.

    <Grid Margin="20">
        <TextBlock TextWrapping="Wrap" TextAlignment="Justify" FontSize="17">
        <Bold FontFamily="Segoe UI Light" FontSize="70">I.R. Iran</Bold><LineBreak/>
        <Span FontSize="35">I</Span>ran or Persia, officially the <Italic>Islamic Republic of Iran</Italic>, 
        is a country in Western Asia. The country is bordered on the 
        north by Armenia, Azerbaijan and Turkmenistan, with Kazakhstan and Russia 
        to the north across the Caspian Sea.<LineBreak/>
        <Span FontSize="10">For more information about Iran see <Hyperlink NavigateUri="http://en.WikiPedia.org/wiki/Iran">WikiPedia</Hyperlink></Span>
            <LineBreak/>
            <LineBreak/>
            <Span FontSize="12">
                <Span>Is this page helpful?</Span>
                <Button Content="No"/>
                <Button Content="Yes"/>
            </Span>
    </TextBlock>
    </Grid>

여기에 이미지 설명을 입력하십시오


질문은 " 요소가 아닌 속성으로 설정 될 때 텍스트에 줄 바꿈을 추가하는 방법 .

15

이 작업을 수행하려면 Text 속성에서 수행해야합니다.

<TextBlock>Stuff on line1&#x0a;Stuff on line 2</TextBlock>

12

아마 누군가가 선호

<TextBlock Text="{Binding StringFormat='Stuff on line1{0}Stuff on line2{0}Stuff on line3',
                          Source={x:Static s:Environment.NewLine}}" />

xmlns:s="clr-namespace:System;assembly=mscorlib" .


추가 & # x0a; XAML에서 작동하는 것으로 보이지만 코드에서 발생하지 않습니다. 이거에요
FDF

11

이 질문에 대한 모든 답변을 시도했지만 여전히 그들 중 누구도 당신을 위해 작동하지 이유에 그들의 머리를 긁적, 당신은 내가 우연히 문제의 형태로 실행 된이있을 수 있습니다.

TextBlock.Text속성은 ToolTipService.ToolTip요소 내부에 있었고 SQL 저장 프로 시저에서 데이터를 가져 오는 객체의 속성에 데이터 바인딩되었습니다. 이제 스토어드 프로 시저 내의이 특정 특성의 데이터가 SQL 함수에서 가져 왔습니다.

아무것도 효과가 없었기 때문에 검색을 포기하고 아래 변환기 클래스를 만들었습니다.

public class NewLineConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var s = string.Empty;

        if (value.IsNotNull())
        {
            s = value.ToString();

            if (s.Contains("\\r\\n"))
                s = s.Replace("\\r\\n", Environment.NewLine);

            if (s.Contains("\\n"))
                s = s.Replace("\\n", Environment.NewLine);

            if (s.Contains("&#x0a;&#x0d;"))
                s = s.Replace("&#x0a;&#x0d;", Environment.NewLine);

            if (s.Contains("&#x0a;"))
                s = s.Replace("&#x0a;", Environment.NewLine);

            if (s.Contains("&#x0d;"))
                s = s.Replace("&#x0d;", Environment.NewLine);

            if (s.Contains("&#10;&#13;"))
                s = s.Replace("&#10;&#13;", Environment.NewLine);

            if (s.Contains("&#10;"))
                s = s.Replace("&#10;", Environment.NewLine);

            if (s.Contains("&#13;"))
                s = s.Replace("&#13;", Environment.NewLine);

            if (s.Contains("<br />"))
                s = s.Replace("<br />", Environment.NewLine);

            if (s.Contains("<LineBreak />"))
                s = s.Replace("<LineBreak />", Environment.NewLine);
        }

        return s;
    }

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

@ dparker 's answerEnivornment.NewLine메소드 를 사용해야했습니다 . 변환기에 개행의 가능한 텍스트 표현을 찾아서로 바꾸도록 지시했습니다 .Environment.NewLine

이것은 효과가 있었다!

그러나 다른 방법 중 어느 것도 데이터 바인딩 속성으로 작동하지 않는 이유에 대해서는 여전히 당황했습니다.

@BobKing의 대답 에 대한 의견을 남겼습니다 .

@BobKing-SQL sproc에서 줄 바꿈이 포함 된 필드에 바인딩 할 때 ToolTipService.ToolTip에서 작동하지 않는 것 같습니다.

그는 다음과 같이 대답했다.

@CodeMaverick 새 줄이 포함 된 텍스트에 바인딩하는 경우 XML 센티넬이 아닌 실제 char 10 값 (또는 13)이어야합니다. 이것은 XAML 파일에 리터럴 줄 바꿈을 작성하려는 경우에만 해당됩니다.

전구가 꺼졌다!

나는 SQL 함수에 들어가서 줄 바꿈의 텍스트 표현을 ...

CHAR( 13 ) + CHAR( 10 )

... 내 TextBlock.Text바인딩 에서 변환기를 제거 하고 그와 같이 ... 작동했습니다!


9

이 정보가 도움이되었지만 XAML의 "Content = ..."태그에 추가 할 때 약간의 오류가 발생했습니다.

내용에 여러 줄이 있었고 나중에 지정하지 않아도 내용이 공백을 유지한다는 것을 알았습니다. 그래서 그 문제를 해결하고 공백을 "무시"시키려면 다음과 같이 구현했습니다.

<ToolTip Width="200" Style="{StaticResource ToolTip}" 
         Content="'Text Line 1' 
                   &#x0a;&#x0d;'Text Line 2' 
                   &#x0a;&#x0d;'Text Line 3'"/>

이것이 다른 누군가를 돕기를 바랍니다.

(출력에는 세 줄의 텍스트 줄이 있으며 그 사이에 빈 줄이 있습니다.)


<ToolTip> <ToolTip.Content> <TextBlock Text = '.....'/> </ ToolTip.Content> </ ToolTip>
Simon_Weaver

5

나는 이것이 오래된 질문에 있다는 것을 알고 있지만 그것을 추가하고 싶었다.

Environment.NewLine

코드를 통해이 작업을 수행하는 경우에도 작동합니다.


4
<TextBlock>
    Stuff on line1 <LineBreak/>
    Stuff on line2
</TextBlock>

아는 것이 중요하지는 않지만 TextBlock 태그 사이에 지정하는 것을 인라인 내용이라고하며 InlineCollection 인 TextBlock.Inlines 속성으로 이동하고 Inline 유형의 항목을 포함합니다. Inline의 서브 클래스는 Run과 LineBreak입니다. TextBlock을 참조하십시오.


3

또한 작동하지 않습니다

<TextBlock><TextBlock.Text>NO USING ABOVE TECHNIQUE HERE</TextBlock.Text>

별거 아냐, 그냥 사용해야 했어

<TextBlock Text="Cool &#x0a;Newline trick" />

대신에.



-1

코드 숨김 솔루션

private void Button1_Click(object sender, RoutedEventArgs e)
{
    System.Text.StringBuilder myStringBuilder = new System.Text.StringBuilder();
    myStringBuilder.Append("Orange").AppendLine();
    myStringBuilder.Append("").AppendLine();
    myStringBuilder.Append("Apple").AppendLine();
    myStringBuilder.Append("Banana").AppendLine();
    myStringBuilder.Append("").AppendLine();
    myStringBuilder.Append("Plum").AppendLine();
    TextBox1.Text = myStringBuilder.ToString();
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.