Estilo de envoltura de texto del botón WPF
button styles (5)
Aquí hay un ejemplo de la respuesta de Eric en 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
};
¿Cómo cambio el estilo de envoltura de texto predeterminado de un botón en WPF?
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 intento:
<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 inútil del compilador:
Error 5 After a ''SetterBaseCollection'' is in use (sealed), it cannot be modified.
La eliminación de la etiqueta ControlTemplate guarda 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 configurar el envoltorio de texto para cada botón individualmente, pero eso es bastante estúpido. ¿Cómo puedo hacerlo como un estilo? ¿Cuáles son las palabras mágicas?
Y para futuras referencias, ¿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.
Para expandir la respuesta de Eric con un ejemplo:
<Button Name="btnName" Width="50" Height="40">
<TextBlock Text="Some long text" TextWrapping="Wrap" TextAlignment="Center"/>
</Button>
Resolví este problema agregando un TextBlock
al botón y usándolo para mostrar el texto del botón en lugar de la propiedad Content
del botón. Asegúrese de establecer la propiedad height del TextBlock
en Auto
, de modo que crezca en altura para acomodar el número de líneas de texto a medida que se envuelve.
Su segunda versión debería funcionar, y lo hace para mí, con la advertencia de que debe cambiar el texto de la encuadernación 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>
Tenga en cuenta que esto reemplaza por completo el estilo del botón (es decir, tendrá que crear su propio botón cromado si lo desea).
Con respecto a su segunda pregunta, todas las propiedades de dependencia de escritura se pueden establecer utilizando 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.
<Style TargetType="Button">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{TemplateBinding Content}" TextWrapping="Wrap" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>