2009-04-15 125 views
24

如何更改WPF中按鈕的默認textwrapping樣式?WPF按鈕textwrap樣式

的顯而易見的解決方案:

<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. 

刪除控件模板標籤保持錯誤。

下嘗試產生了不同的錯誤:

<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. 

我看到,我可以爲每個單獨的按鈕textwrapping,但是這是非常愚蠢的。我怎樣才能做到這一點?什麼是神奇的話語?

爲了將來的參考,我在哪裏可以找到這些魔術詞的列表,所以我可以自己做這個?當我嘗試瞭解setter可以設置哪些屬性時,MSDN條目是無用的。

回答

24

你的第二個版本應該工作,並且做對我來說,與您需要更改TextBlock的文字結合的告誡:

<!-- 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> 

注意這完全取代了按鈕樣式(即你需要創建你的自己的按鈕鉻,如果你想要它)。

關於你的第二個問題,所有可寫入的依賴屬性可以使用Setter來設置。您無法通過樣式在Button上設置TextWrapping的原因是Button沒有TextWrapping依賴項屬性(或者實際上是任何TextWrapping屬性)。沒有「魔術字」,只是依賴屬性的名稱。

+1

沒有,有魔力的話。在這種情況下,神奇的單詞是「TemplateBinding內容」。謝謝你讓我知道。 – mmr 2009-04-16 00:39:21

36

我解決了這個問題,在按鈕上添加了一個TextBlock,並用它來顯示按鈕文本,而不是按鈕的Content屬性。請確保將TextBlock的高度屬性設置爲Auto,以便它在高度上增長以適應包裝時的文本行數。

+6

這絕對比接受的答案更容易/更清晰,但他的方式也起作用。 – 2012-03-29 21:00:30

32

擴大Eric的回答有一個例子: -

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

這裏的埃裏克在C#代碼隱藏答案的例子:

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 
}; 
3
<Style TargetType="Button"> 
    <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <TextBlock Text="{TemplateBinding Content}" TextWrapping="Wrap" /> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style>