[xaml] 문자열 속성의 개행

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

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

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

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



답변

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

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

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

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


답변

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

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


답변

사용해야합니다 (자원에 예) 당신은 문자열을해야 할 때 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 개의 캐리지 리턴 및 잠재적으로 보이지 않는 공백을 추가했습니다.


답변

<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>

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


답변

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

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


답변

아마 누군가가 선호

<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" .


답변

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

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바인딩 에서 변환기를 제거 하고 그와 같이 … 작동했습니다!