属性として設定されているテキストに改行を追加するにはどうすればよいですか:
<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
Stuff on line 2"/>
16進数でエンコードされた値を使用して、リテラルを表すことができます。この場合、改行(char 10)を使用しました。 「クラシック」vbCrLf
を実行する場合は、

を使用できます。
ところで、構文に注意してください。アンパサンド、ポンド、文字x、次に目的の文字の16進値、最後にセミコロンです。
また、完全を期すために、コードビハインドの定数または実行時に構築される変数のように、すでに改行が埋め込まれているテキストにバインドできます。
ソースXAMLの空白を保持するために、xml:space = "preserve"属性を使用できます
<TextBlock xml:space="preserve">
Stuff on line 1
Stuff on line 2
</TextBlock>
文字列で(たとえば、リソースで)行う必要がある場合は、xml:space="preserve"
andを使用する必要があります。
<System:String x:Key="TwoLiner" xml:space="preserve">First line Second line</System:String>
または、テキスト内のリテラル改行:
<System:String x:Key="TwoLiner" xml:space="preserve">First line
Second line</System:String>
警告:2番目の例のようなコードを記述する場合、オペレーティングシステムやテキストエディタが使用する行末に応じて、either改行、または復帰と改行を挿入します。例えば、それを書いて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>
これを行うには、テキスト属性で行う必要があることに注意してください。
<TextBlock>Stuff on line1
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"
で。
この質問へのすべての答えを試してみて、stillどれもあなたのために機能しない理由について頭を掻いている人のために、あなたが私が実行した問題の形に遭遇したかもしれませんに。
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("

"))
s = s.Replace("

", Environment.NewLine);
if (s.Contains("
"))
s = s.Replace("
", Environment.NewLine);
if (s.Contains("
"))
s = s.Replace("
", Environment.NewLine);
if (s.Contains(" "))
s = s.Replace(" ", Environment.NewLine);
if (s.Contains(" "))
s = s.Replace(" ", Environment.NewLine);
if (s.Contains(" "))
s = s.Replace(" ", 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 answer のEnivornment.NewLine
メソッドを使用することになりました。コンバーターに、改行の可能なテキスト表現を探して、それをEnvironment.NewLine
に置き換えるように指示しました。
これはうまくいきました!
ただし、データバインドされたプロパティで動作する他のメソッドが存在しない理由についてはまだ困惑していました。
@ BobKingの受け入れられた答え にコメントを残しました:
@BobKing-これは、SQL sprocから埋め込まれた改行を含むフィールドにバインドする場合、ToolTipService.ToolTipで機能しないようです。
彼は答えた:
@CodeMaverick新しい行が埋め込まれたテキストにバインドする場合、それらはおそらく実際のchar 10値(または13's)であり、XMLセンチネルではないはずです。これは、XAMLファイルにリテラルの改行を書き込みたい場合のみです。
電球が消えた!
私はSQL関数に入り、改行のテキスト表現を...に置き換えました.
CHAR( 13 ) + CHAR( 10 )
...コンバータをTextBlock.Text
バインディングから削除し、そのように...it!
これは便利ですが、XAMLの「Content = ...」タグに追加するとエラーが発生しました。
コンテンツに複数の行があり、後で指定しなくてもコンテンツが空白を保持していることがわかりました。それを回避し、空白を「無視」するために、このように実装しました。
<ToolTip Width="200" Style="{StaticResource ToolTip}"
Content="'Text Line 1'


'Text Line 2'


'Text Line 3'"/>
これが誰かの助けになることを願っています。
(出力には3行のテキスト行があり、それぞれの間に空行があります。)
私はこれが古い質問にあることを理解していますが、それを追加したかっただけです
Environment.NewLine
コードでこれを行う場合にも機能します。
また、動作しません
<TextBlock><TextBlock.Text>NO USING ABOVE TECHNIQUE HERE</TextBlock.Text>
大したことない、使用するだけでいい
<TextBlock Text="Cool 
Newline trick" />
代わりに。
<TextBlock>
Stuff on line1 <LineBreak/>
Stuff on line2
</TextBlock>
知っておくことが重要というわけではありませんが、TextBlockタグの間に指定するものはインラインコンテンツと呼ばれ、InlineCollectionであり、Inlineタイプのアイテムを含むTextBlock.Inlinesプロパティに入ります。 Inlineのサブクラスは、特にRunとLineBreakです。 TextBlock.Inlines を参照してください
<TextBox
Name="myTextBox"
TextWrapping="Wrap"
AcceptsReturn="True"
VerticalScrollBarVisibility="Visible" />