C#のみを使用してWPFボタンで複数行のテキストを取得するにはどうすればよいですか? XAMLで<LineBreak/>
を使用する例を見てきましたが、ボタンはC#で完全にプログラムで作成されます。ボタンの番号とラベルはドメインモデルの値に対応しているため、XAMLを使用してこれを指定することはできないと思います。
以下の素朴なアプローチを試しましたが、うまくいきません。
Button b = new Button();
b.Content = "Two\nLines";
または
b.Content = "Two\r\nLines";
どちらの場合でも、表示されるのはテキストの最初の行(「2」)だけです。
「\ n」が正常に動作することが判明しました。グリッドのサイズは固定されており、ボタンに使用可能なテキストがあることを視覚的に示すだけではありません(たとえば、カットオフを示す「...」はありません)。グリッドのサイズを大きく拡大すると、ボタンのテキストが2行で表示されました。
またはXAMLで直接:
<Button>
<TextBlock>Two<LineBreak/>Lines</TextBlock>
</Button>
私はこの方法を好む:
<Button Width="100">
<TextBlock TextWrapping="Wrap">This is a fairly long button label</TextBlock>
</Button>
それは私のために働いた。
答えはとても簡単です。単に

改行を導入する、すなわち:
<Button Content="Row 1 Text 
 Row 2 Text"/>
XAMLを介してこれを行うには、いくつかの方法があります。
<Button> <TextBlock TextAlignment="Center">Line 1<LineBreak/>Line 2</TextBlock> </Button>
この方法は簡単ですが、テキストの配置を簡単に制御する方法はありません。
<Button Content="Line 1 
 Line 2"/>
ButtonsのサイズがTextBlocksのサイズよりも小さくなると、単にコンテンツが2行以上に自動的に分割されます
<Button> <TextBlock TextWrapping="Wrap" HorizontalAlignment="Center">Line 1 Line 2</TextBlock> </Button>
<Button> <StackPanel> <TextBlock Text="Line1" HorizontalAlignment="Center"/> <TextBlock Text="Line2" HorizontalAlignment="Center"/> </StackPanel> </Button>
<Button> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBlock Text="Line1" HorizontalAlignment="Center"/> <TextBlock Text="Line2" HorizontalAlignment="Center"/> </Grid> </Button>
これはここで行う方法で、簡単にセンタリングすることもできます
<Button Height="40" Width="75">
<StackPanel>
<TextBlock Text="Line1" HorizontalAlignment="Center"/>
<TextBlock Text="Line2" HorizontalAlignment="Center"/>
</StackPanel>
</Button>
これを試しましたか?
b.Content = new TextBlock {
Text = "Two\lLines",
TextWrapping = TextWrapping.Wrap };
それが機能しない場合は、StackPanelを子として追加し、それに2つのTextBlock要素を追加してみてください。
どうですか:
TextBlock textBlock = new TextBlock();
textBlock.Inlines.Add("Two");
textBlock.Inlines.Add(new LineBreak());
textBlock.Inlines.Add("Lines");
Button button = new Button();
button.Content = textBlock;
C#3を使用している場合は、少しすっきりさせることができます。
Button button = new Button
{
Content = new TextBlock { Inlines = { "Two", new LineBreak(), "Lines" } }
};
以下のコードを試してください:
<Button Command="{Binding DeliveryDateCommand}" x:Name="cntlbtnf5" Background="White" BorderBrush="#FFABADB3" Grid.Column="4">
<Border BorderBrush="{x:Null}" Height="Auto">
<TextBlock Text="Ctrl + F5 Delivery BillDate" TextWrapping="Wrap" Width="110" TextAlignment="Center" Height="44" />
</Border>
</Button>
同じ問題がありました。
私は試した:
-button.content = "Line1\nLine2"(動作しなかった、おそらく何か間違ったことをした);
-ボタンのテキストを新しいラベルに置き換えます(テキストを中央揃えにしないでください)。
-ボタンのテキストをテキストブロックに置き換えます(これにより、テキストを中央に揃えることができますが、折り返すことはできません)。
私は、スタックパネルまたはグリッドの使用に言及する回答を見てきました。
Textbox を使用しないようにとの回答を見ました。
OPは\n
は機能しますが、それが行く方法ではないと思います。私の意見では、あなたはコントロールにあなたがやりたいことを強引に強制しているだけで、もしあなたが行かなければならないテキストを変更する必要があるならテキストが正しく折り返されているか、\n
は別の位置にある必要があります。
(私にとって)最善の方法であることがわかったのは、ボタンのコンテンツをテキストボックスに置き換え(ドラッグアンドドロップするだけで、XAMLを台無しにする必要はありません)、次のプロパティを記載:IsReadOnly = true;
Focusable = false(オプション);
おもう Focusable = false
は、ユーザーがテキストを選択できないようにします。編集することはできませんが、ユーザーが選択することさえ望んでいません(個人的な好み)。
これにより、テキストボックスはラベルと同様に動作しますが、テキストを中央に揃えることができるという利点があります。