2009-04-15 14 views
24

Come si modifica lo stile predefinito per il textwrapping di un pulsante in WPF?Stile WPF per il textwrap

La soluzione più ovvia di:

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

non funziona, perché TextWrapping non è una proprietà impostabile qui, a quanto pare.

se provo:

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

ho appena ottenere una risposta inutile dal compilatore:

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

Rimozione del tag ControlTemplate mantiene l'errore.

Il seguente tentativo produce un errore diverso:

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

vedo che posso impostare la TextWrapping per ogni pulsante individualmente, ma questo è abbastanza stupido. Come posso farlo come stile? Quali sono le parole magiche?

E per riferimento futuro, dove posso trovare un elenco di queste parole magiche, quindi posso farlo da solo? La voce MSDN è piuttosto inutile quando cerco di scoprire quali proprietà possono essere impostate dal setter.

risposta

24

tua seconda versione dovrebbe funzionare, e lo fa per me, con l'avvertenza che è necessario modificare vincolante 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> 

Nota questo sostituisce completamente lo stile del pulsante (cioè è necessario creare il possedere il pulsante chrome se lo si desidera).

Per quanto riguarda la seconda domanda, tutte le proprietà di dipendenza scrivibili possono essere impostate utilizzando un Setter. Il motivo per cui non è stato possibile impostare TextWrapping su un pulsante tramite uno stile è che Button non ha una proprietà di dipendenza TextWrapping (o in effetti una proprietà TextWrapping). Non ci sono "parole magiche", solo i nomi delle proprietà di dipendenza.

+1

No, non ci sono parole magiche. In questo caso, le parole magiche erano "TemplateBinding Content". Grazie per avermi fatto sapere. – mmr

36

Ho risolto questo problema aggiungendo un pulsante TextBlock e utilizzandolo per visualizzare il testo del pulsante anziché la proprietà Content del pulsante. Assicurati di impostare la proprietà dell'altezza dello TextBlock su Auto, in modo che aumenti di altezza in modo da adattarsi al numero di righe di testo che avvolge.

+6

Questo è sicuramente più facile/pulito della risposta accettata, ma anche il suo modo funziona. –

+0

Vedere le risposte di seguito per gli esempi del codice necessario. –

32

Per espandere la risposta di Eric con un esempio: -

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

Ecco un esempio di risposta di Eric in C# code-behind:

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>