web-dev-qa-db-ja.com

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

XMLファイルからテキストを取得しています。新しい行としてtextblockレンダリングによって解釈される新しい行を挿入したいと思います。

私はもう試した:

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

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

GUIで新しい行をレンダリングするために、XMLに何を入れる必要がありますか?

XAMLでテキストを手動で設定するこのようなことを試みました:

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

また、エンコードされた文字はGUIに表示されませんが、改行も表示されません。

90

データに新しい行を追加してみてください:

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

それでもうまくいかない場合は、文字列を手動で解析する必要があります。

直接XAMLが必要な場合は、簡単です:

<TextBlock>
    Lorem <LineBreak/>
    Ipsum
</TextBlock>
157
H.B.

完全を期すために、次のこともできます。

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

バインディングを使用することもできます

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

そして、次のようにMyTextを設定します。

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

あなたは使わなければなりません

 < 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

18
GameAlchemist

これは古い質問ですが、問題に出会って、与えられた答えとは異なる方法で解決しました。たぶん他の人に役立つかもしれません。

私の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();
    }
}
12
Dan Vogel

他のすべてが失敗した場合は、使用することもできます

"My text needs a line break here" + System.Environment.NewLine + " This should be a new line"
9
Adrian
<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>
8
alkk

System.Environment.NewLineを使用することが、私にとって有効な唯一のソリューションです。\r\nを試してみたところ、テキストボックスで実際の\ r\nを繰り返しただけです。

1
Order23

テキストブロックでこのオプションが有効になっていることを確認する必要があります。

AcceptsReturn="True"
0
Dave

次のように、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ファイルを再度開いたときに正しいことが保証されます。それは私がこれまでに懸命に試みた後に見つけたものです。私の3つのコード行は、LinesとBreaksが行くべきTextPointer項目(.Start .End .ContentStart .ContentEnd)を設定するために、より多くのコード(ループ付き)で囲まれる必要があります。

0
Josh