2009-04-15 15 views
24

¿Cómo cambio el estilo de encuadernación de texto predeterminado de un botón en WPF?WPF button textwrap style

La solución obvia de:

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

no funciona, porque Textwrapping no es una propiedad configurable aquí, al parecer.

si trato:

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

acabo de obtener una respuesta sin valor del compilador:

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

Extracción de la etiqueta ControlTemplate mantiene el error.

El siguiente intento produce un error diferente:

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

veo que puedo establecer el textwrapping para cada botón individualmente, pero eso es bastante estúpida. ¿Cómo puedo hacerlo como un estilo? ¿Cuáles son las palabras mágicas?

Y para referencia futura, ¿dónde puedo encontrar una lista de estas palabras mágicas, así que puedo hacer esto solo? La entrada de MSDN es bastante inútil cuando trato de averiguar qué propiedades puede establecer el colocador.

Respuesta

24

Su segunda versión debería funcionar, y lo hace para mí, con la advertencia de que es necesario cambiar la unión del texto 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> 

Nota esto reemplaza por completo el estilo de botón (es decir, tendrá que crear su propio botón cromado si lo desea).

En relación con su segunda pregunta, todas las propiedades de dependencia de escritura se pueden establecer con un Setter. La razón por la que no pudo establecer TextWrapping en un botón a través de un estilo es que Button no tiene una propiedad de dependencia TextWrapping (o de hecho ninguna propiedad Text Wrapping). No hay "palabras mágicas", solo los nombres de las propiedades de dependencia.

+1

No, no son palabras mágicas. En este caso, las palabras mágicas fueron "Contenido de vinculación de la plantilla". Gracias por hacérmelo saber. – mmr

36

Resolví este problema agregando un TextBlock al botón y usándolo para mostrar el texto del botón en lugar de la propiedad del botón Content. Asegúrese de establecer la propiedad de altura TextBlock en Auto, de modo que crezca en altura para acomodar el número de líneas de texto a medida que se envuelve.

+6

Esto es definitivamente más fácil/más limpio que la respuesta aceptada, pero su forma también funciona. –

+0

Consulte las respuestas a continuación para ver ejemplos del código necesario. –

32

Para ampliar la respuesta de Eric con un ejemplo: -

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

He aquí un ejemplo de la respuesta de Eric en C# de código subyacente:

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>