文字列属性の改行


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 2010

45
今日、私はこの回答に34の賛成票を持っていますが、構文が非常に古くなっているため、戻って確認する必要がありました。
ボブ・キング

3
もちろんです。これをブックマークしました。私はいつもそれをチェックしに来なければなりません。
MojoFilter 2011

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

5
次のようにバックスラッシュを追加すると、バインディングパラメータ内でも機能します:ConverterParameter = 'Test \&#x0a; Text'
Sven

72

ソースxmlの空白を保持するために属性xml:space = "preserve"を使用できる場合があります

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

8
また、xml:space = "preserve"を削除して、行間に<LineBreak />を追加することもできます。
helpfulBee

5
xml:space="preserve"通常はXAMLに存在するインデントスペースも保持されることに注意してください(数年後)。したがって、<LineBreak />上記の明示的な方法は、よりクリーンなソリューションのようです。
Zeus

ありがとう!このソリューションは、XAMLベースのシリアル化コードに非常によく適合しました。
セラフィム2017年

これは完璧に機能しました。ボイラープレートコードを大幅に節約できました。ありがとう
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>

警告:2番目の例のようなコードを記述した場合、オペレーティングシステムやテキストエディターが使用している行末に応じて、改行、または改行と改行が挿入されいます。たとえば、それを書いてLinuxシステムからgitにコミットすると、すべてが正常に見えるかもしれませんが、誰かがそれをWindowsに複製すると、gitは行末をに変換し\r\n、文字列の目的に応じて...世界を壊すかもしれない。

空白を保存する場合は、そのことに注意してください。次のようなものを書いた場合:

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

実際には、4つの改行、おそらく4つの改行、および目に見えない末尾の空白が追加されています...


10
ところで、xml:space="preserve"属性ResourceDictionaryも同様に適用できるので、すべてのリソース文字列に属性を適用する必要はありません。
ocodo

1
アンパサンドなしでも動作します。このようなもの:( <System:String x:Key="TwoLiner" xml:space="preserve">First line Second line</System:String> 最初の行と2番目の行の間に改行を入れて)
vgaltes '7/07/15

1
私は、私はあなたに10を与えることがしたいxml:space="preserve"
TimothyP

1
@trooper編集を行ったばかりで、Jaykul / modの承認に任されていました。そして、Jaykulのさらなるビルドは、ここでのマイナーな詳細を本当に明確にしました(私の編集では、望み通りの出力が得られなかったため)。全体として、このやり取りは、自分で投稿するよりも、より良い回答を作成するのに役立つと思います。
アンソニールサルディ2017年

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の答えEnivornment.NewLineからメソッドを使用しなければならなくなりました。改行の可能なテキスト表現を探してそれをに置き換えるようにコンバーターに指示しました。Environment.NewLine

これはうまくいった!

ただし、なぜ他のメソッドのどれもデータバインドされたプロパティで機能しないのかについて、私はまだ困惑しました。

私は@BobKingの受け入れられた回答にコメントを残しました:

@BobKing-SQL sprocから埋め込まれた改行を持つフィールドにバインドする場合、これはToolTipService.ToolTipでは機能しないようです。

彼はこう答えた:

@CodeMaverick新しい行が埋め込まれたテキストにバインドしている場合は、XMLセンチネルではなく、実際の文字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'"/>

これが他の誰かを助けることを願っています。

(出力には、3つのテキスト行があり、それぞれの間に空行があります。)


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

5

これは古い質問に関するものだと思いますが、それを追加したかっただけです

Environment.NewLine

コードでこれを行う場合にも機能します。


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

知っておくことが重要であるというわけではありませんが、TextBlockタグの間に指定したものはインラインコンテンツと呼ばれ、InlineCollectionであり、Inlineタイプのアイテムを含むTextBlock.Inlinesプロパティに入ります。Inlineのサブクラスは、特にRunとLineBreakです。TextBlock.Inlinesを参照してください


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.