web-dev-qa-db-ja.com

WPFボタンのテキストラップスタイル

WPFのボタンの既定のテキスト折り返しスタイルを変更するにはどうすればよいですか?

明白な解決策:

<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="TextWrapping" Value="Wrap"></Setter>
</Style>

textwrappingはここでは設定可能なプロパティではないため、機能しません。

私が試した場合:

<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <TextBlock Text="{Binding}" Foreground="White" FontSize="20" FontFamily="Global User Interface" TextWrapping="Wrap"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

私はコンパイラから価値のない応答を受け取ります:

Error   5   After a 'SetterBaseCollection' is in use (sealed), it cannot be modified.   

ControlTemplateタグを削除してもエラーが発生します。

次の試行では別のエラーが発生します。

    <Setter Property="TextBlock">
        <TextBlock Text="{Binding}" Foreground="White" FontSize="20" FontFamily="Global User Interface" TextWrapping="Wrap"/>
    </Setter>

Error   5   The type 'Setter' does not support direct content.  

各ボタンのテキスト折り返しを個別に設定できることがわかりましたが、それはかなりおかしいです。スタイルとしてどうすればいいですか?魔法の言葉は何ですか?

そして、将来の参考のために、これらの魔法の単語のリストはどこにありますか?自分でこれを行うことができますか? MSDNエントリは、セッターで設定できるプロパティについて調べようとすると、ほとんど役に立ちません。

29
mmr

2番目のバージョンは動作するはずですが、私にとっては機能しますが、TextBlock Textバインディングを変更する必要があることに注意してください。

<!-- in Window.Resources -->
<Style x:Key="fie" TargetType="Button">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type Button}">
        <TextBlock Text="{TemplateBinding Content}" FontSize="20" TextWrapping="Wrap"/>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

<!-- then -->
<Button Style="{StaticResource fie}">verylongcaptiongoeshereandwraps/Button>

これはボタンのスタイルを完全に置き換えることに注意してください(つまり、必要に応じて独自のボタンchrome)を作成する必要があります)。

2番目の質問に関しては、すべての書き込み可能な依存関係プロパティをセッターを使用して設定できます。スタイルを介してボタンにTextWrappingを設定できなかった理由は、ButtonにTextWrapping依存関係プロパティ(または実際にはTextWrappingプロパティ)がないためです。 「魔法の言葉」はなく、依存関係プロパティの名前のみが含まれます。

27
itowlson

例を挙げてエリックの答えを拡張するには:-

<Button Name="btnName" Width="50" Height="40">
   <TextBlock Text="Some long text" TextWrapping="Wrap" TextAlignment="Center"/>
</Button>
43
Rob

TextBlockをボタンに追加し、それを使用してボタンのContentプロパティの代わりにボタンのテキストを表示することで、この問題を解決しました。 TextBlockの高さプロパティを必ずAutoに設定して、折り返すときにテキストの行数に合わせて高さが大きくなるようにします。

40
Eric
<Style TargetType="Button">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBlock Text="{TemplateBinding Content}" TextWrapping="Wrap" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>
5
Mike Eshva

これは、C#のコードビハインドでのEricの回答の例です。

var MyButton = new Button();

MyButton.Content = new TextBlock() {
    FontSize        = 25,
    Text            = "Hello world, I'm a pretty long button!",
    TextAlignment   = TextAlignment.Center,
    TextWrapping    = TextWrapping.Wrap
};
4
Danny Beckett