web-dev-qa-db-ja.com

WPFボタンの複数行テキスト

C#のみを使用してWPFボタンで複数行のテキストを取得するにはどうすればよいですか? XAMLで<LineBreak/>を使用する例を見てきましたが、ボタンはC#で完全にプログラムで作成されます。ボタンの番号とラベルはドメインモデルの値に対応しているため、XAMLを使用してこれを指定することはできないと思います。

以下の素朴なアプローチを試しましたが、うまくいきません。

Button b = new Button();
b.Content = "Two\nLines";

または

b.Content = "Two\r\nLines";

どちらの場合でも、表示されるのはテキストの最初の行(「2」)だけです。

60
Paul

「\ n」が正常に動作することが判明しました。グリッドのサイズは固定されており、ボタンに使用可能なテキストがあることを視覚的に示すだけではありません(たとえば、カットオフを示す「...」はありません)。グリッドのサイズを大きく拡大すると、ボタンのテキストが2行で表示されました。

8
Paul

またはXAMLで直接:

<Button>
   <TextBlock>Two<LineBreak/>Lines</TextBlock>  
</Button>
92
Sergey Malyan

私はこの方法を好む:

<Button Width="100">
  <TextBlock TextWrapping="Wrap">This is a fairly long button label</TextBlock>
</Button>

それは私のために働いた。

46
MelloG

答えはとても簡単です。単に&#xa;改行を導入する、すなわち:

<Button Content="Row 1 Text &#xa; Row 2 Text"/>
33
Hassan Rahman

XAMLを介してこれを行うには、いくつかの方法があります。

  1. 改行を含むTextBlockを追加します。
<Button>     
    <TextBlock TextAlignment="Center">Line 1<LineBreak/>Line 2</TextBlock>
</Button>
  1. テキストに改行を追加します。

この方法は簡単ですが、テキストの配置を簡単に制御する方法はありません。

    <Button Content="Line 1 &#xa; Line 2"/>
  1. テキストブロックを追加し、テキストを折り返す

ButtonsのサイズがTextBlocksのサイズよりも小さくなると、単にコンテンツが2行以上に自動的に分割されます

<Button>
  <TextBlock TextWrapping="Wrap" HorizontalAlignment="Center">Line 1 Line 2</TextBlock>
</Button>
  1. ボタンでStackPanelを使用し、各行をテキストブロックとして追加します。
<Button>
    <StackPanel>
        <TextBlock Text="Line1" HorizontalAlignment="Center"/>
        <TextBlock Text="Line2" HorizontalAlignment="Center"/>
    </StackPanel>
</Button>
  1. ボタンでグリッドを使用します。
<Button>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
            <TextBlock Text="Line1" HorizontalAlignment="Center"/>
            <TextBlock Text="Line2" HorizontalAlignment="Center"/>
    </Grid>
</Button>
  • もっとたくさんあると思いますが、リストは基本的にお気に入りから順に並んでいます。
19
Merav Kochavi

これはここで行う方法で、簡単にセンタリングすることもできます

<Button Height="40" Width="75">
    <StackPanel>
        <TextBlock Text="Line1" HorizontalAlignment="Center"/>
        <TextBlock Text="Line2" HorizontalAlignment="Center"/>
    </StackPanel>
</Button>
11
Dennis O J

これを試しましたか?

b.Content = new TextBlock { 
    Text = "Two\lLines", 
    TextWrapping = TextWrapping.Wrap };

それが機能しない場合は、StackPanelを子として追加し、それに2つのTextBlock要素を追加してみてください。

5
Drew Noakes

どうですか:

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" } }
};
4
Jon Skeet

以下のコードを試してください:

<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>
0
Ghotekar Rahul

同じ問題がありました。

私は試した:
-button.content = "Line1\nLine2"(動作しなかった、おそらく何か間違ったことをした);
-ボタンのテキストを新しいラベルに置き換えます(テキストを中央揃えにしないでください)。
-ボタンのテキストをテキストブロックに置き換えます(これにより、テキストを中央に揃えることができますが、折り返すことはできません)。

私は、スタックパネルまたはグリッドの使用に言及する回答を見てきました。
Textbox を使用しないようにとの回答を見ました。

OPは\nは機能しますが、それが行く方法ではないと思います。私の意見では、あなたはコントロールにあなたがやりたいことを強引に強制しているだけで、もしあなたが行かなければならないテキストを変更する必要があるならテキストが正しく折り返されているか、\nは別の位置にある必要があります。
(私にとって)最善の方法であることがわかったのは、ボタンのコンテンツをテキストボックスに置き換え(ドラッグアンドドロップするだけで、XAMLを台無しにする必要はありません)、次のプロパティを記載:IsReadOnly = true;
Focusable = false(オプション);
おもう Focusable = falseは、ユーザーがテキストを選択できないようにします。編集することはできませんが、ユーザーが選択することさえ望んでいません(個人的な好み)。

これにより、テキストボックスはラベルと同様に動作しますが、テキストを中央に揃えることができるという利点があります。

0
Rui Santos