wpf - solo - ¿Cómo hacer que todo el texto sea mayúscula/mayúscula?
minusculas en pages (7)
Aún puede usar un convertidor, simplemente configure el valor del texto en la fuente del enlace:
<TextBlock Text="{Binding Source={StaticResource String1}, Converter ={StaticResource myConverter}}"/>
Quiero que todos los textos en TextBlock
, Label
, MenuItem.Header
se muestren en mayúsculas. Las cadenas se toman de un ResourceDictionary
por ejemplo:
<TextBlock Text="{StaticResource String1}"/>
<MenuItem Header="{StaticResource MenuItemDoThisAndThat}"/>
etc. (también para Label
y otros controles)
No puedo usar un convertidor de valor porque no hay enlace. No quiero hacer las cadenas en mayúsculas en el diccionario mismo.
Creé una propiedad adjunta y un convertidor para esto. Probablemente ya tenga el convertidor, entonces reemplace mi referencia a CaseConverter por la implementación que tenga.
La propiedad adjunta es solo un booleano que configuras si quieres que esté en mayúsculas (obviamente, puedes extender esto para ser enumerable para una selección de estilos). Cuando la propiedad cambia, vuelve a enlazar la propiedad TextBlock''s Text según sea necesario, agregando el convertidor.
Es posible que se necesite hacer un poco más de trabajo cuando la propiedad ya esté vinculada; mi solución asume que es un enlace de ruta simple. Pero también puede ser necesario duplicar la fuente, etc. Sin embargo, sentí que este ejemplo es suficiente para transmitir mi punto de vista.
Aquí está la propiedad adjunta:
public static bool GetUppercase(DependencyObject obj)
{
return (bool)obj.GetValue(UppercaseProperty);
}
public static void SetUppercase(DependencyObject obj, bool value)
{
obj.SetValue(UppercaseProperty, value);
}
// Using a DependencyProperty as the backing store for Uppercase. This enables animation, styling, binding, etc...
public static readonly DependencyProperty UppercaseProperty =
DependencyProperty.RegisterAttached("Uppercase", typeof(bool), typeof(TextHelper), new PropertyMetadata(false, OnUppercaseChanged));
private static void OnUppercaseChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TextBlock txt = d as TextBlock;
if (txt == null) return;
var val = (bool)e.NewValue;
if (val)
{
// rebind the text using converter
// if already bound, use it as source
var original = txt.GetBindingExpression(TextBlock.TextProperty);
var b = new Binding();
if (original != null)
{
b.Path = original.ParentBinding.Path;
}
else
{
b.Source = txt.Text;
}
b.Converter = new CaseConverter() { Case = CharacterCasing.Upper };
txt.SetBinding(TextBlock.TextProperty, b);
}
}
Creo que esto funcionará para ti
<TextBlock Text=''{StaticResource String1}''Typography.Capitals="AllSmallCaps"/>
Para enumeraciones de mayúsculas de fuentes https://msdn.microsoft.com/en-us/library/system.windows.fontcapitals(v=vs.110).aspx
En lugar de utilizar un convertidor, puede usar la etiqueta CharacterCasing en un TextBox, pero en su caso, no funciona en un TextBlock.
<TextBox CharacterCasing="Upper" Text="{StaticResource String1}" />
Esto no responde estrictamente a la pregunta, pero proporciona un truco para causar el mismo efecto.
Creo que muchos encuentran su camino aquí buscando cómo hacerlo con un estilo. TextBlock es un poco complicado aquí porque no es un Control sino un FrameworkElement y por lo tanto no puedes definir una Plantilla para hacer el truco.
La necesidad de utilizar todo el texto en mayúsculas es más probable para los títulos o algo así donde el uso de la etiqueta está justificado. Mi solución fue:
<!-- Examples of CaseConverter can be found in other answers -->
<ControlTemplate x:Key="UppercaseLabelTemplate" TargetType="{x:Type Label}">
<TextBlock Text="{TemplateBinding Content, Converter={StaticResource CaseConverter}}" />
</ControlTemplate>
<Style x:Key="UppercaseHeadingStyle"
TargetType="{x:Type Label}">
<Setter Property="FontSize" Value="20" />
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="Template" Value="{StaticResource UppercaseLabelTemplate}" />
</Style>
<!-- Usage: -->
<Label Content="Header" Style="{StaticResource UppercaseHeadingStyle}" />
Tenga en cuenta que esto deshabilita parte del comportamiento predeterminado de Label, y funciona solo para texto, por lo que no definiría esto como predeterminado (probablemente nadie quiera todas las etiquetas en mayúsculas). Y, por supuesto, debe usar Label en lugar de TextBlock cuando necesite este estilo. Además, no usaría esto dentro de otras plantillas, sino solo estrictamente como un estilo de tema.
Para completar la respuesta de Peter (mi edición ha sido rechazada), puede usar un convertidor como este:
DO#:
public class CaseConverter : IValueConverter
{
public CharacterCasing Case { get; set; }
public CaseConverter()
{
Case = CharacterCasing.Upper;
}
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var str = value as string;
if (str != null)
{
switch (Case)
{
case CharacterCasing.Lower:
return str.ToLower();
case CharacterCasing.Normal:
return str;
case CharacterCasing.Upper:
return str.ToUpper();
default:
return str;
}
}
return string.Empty;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
XAML:
<TextBlock Text="{Binding Source={StaticResource String1}, Converter ={StaticResource myCaseConverter}}"/>
Puede incluir todas las entradas en controles TextBox con la siguiente propiedad:
<TextBox CharacterCasing="Upper"
Para aplicar a todos los controles de TextBox en toda la aplicación, cree un estilo para todos los controles de TextBox:
<Style TargetType="{x:Type TextBox}">
<Setter Property="CharacterCasing" Value="Upper"/>
</Style>