wpf TextBlockコントロールに新しい行を入れる方法は?


101

XMLファイルからテキストをフェッチしています。テキストブロックレンダーによって解釈される新しい行を、新しい行として挿入します。

私はもう試した:

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

ただし、データは新しい行なしで引き続き表示されます。C#を<data>介して.Textプロパティを介してコンテンツを設定します。

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

@DJKRAZE:引用符は何もせず、rとnを一緒にしません。:S
ボリビア人のみ、ここ

@BalamBalam:同じではありません。その質問はText属性について明示的です。
HB

「」が機能しない理由は完全に理解できたようです。その場合、<LineBreak>はリテラル/キーワードのようなものになると思います。私の間違い..すばらしい答えHB
MethodMan

Dan Vogelは最新の実用的なソリューションを作成しました。WPFは\ r \ nを\\ r \\ nに解釈します。
zORg Alex

回答:


173

あなたはデータに新しい行を入れてみることができます:

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

それが機能しない場合は、文字列を手動で解析する必要があるかもしれません。

ちなみに簡単な直接XAMLが必要な場合:

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

いいえ、これも何もしません。Enterキーを押して新しい行としてTextBlockのXAML内にコンテンツをコピーして貼り付けても、一度に表示されます。
ボリビア人のみ

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 2018

3
これは最高の答えです
アウレリオアントニオ・

私はこのリンクを追加します: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()も必要ありません。「My Text \ n Your Text」を返します。正常に動作します。
Zodman、2014

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を両方使用し、テキストの次の行に移動すると、2つの空行が表示されます。

詳細はこちら: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 2017

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ではなく、TextBox専用です
Steve

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)を設定するために、3つのコード行をより多くのコード(ループ付き)で囲む必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.