Comment faire tout le texte majuscule / majuscule?

je veux que tous les textes de l' TextBlock,Label, MenuItem.Header à afficher en majuscules. Les chaînes sont prises à partir d'un ResourceDictionary e.g.:

<TextBlock Text="{StaticResource String1}"/>
<MenuItem Header="{StaticResource MenuItemDoThisAndThat}"/>

etc. (aussi pour Label et d'autres contrôles)

Je ne peux pas utiliser de convertisseur de valeurs parce qu'il n'y a pas de liaison. Je ne veux pas faire les cordes en majuscules dans le dictionnaire lui-même.

31
demandé sur p.s.w.g 2009-11-19 13:54:01

7 réponses

Vous pouvez toujours utiliser un convertisseur, il suffit de définir la valeur du texte dans la source de la reliure:

<TextBlock Text="{Binding Source={StaticResource String1},  Converter ={StaticResource myConverter}}"/>
32
répondu Peter 2009-11-19 11:32:31

au lieu d'utiliser un convertisseur, vous pouvez utiliser le caractère tag dans une boîte de texte mais dans votre cas, il ne fonctionne pas sur un texte.

<TextBox CharacterCasing="Upper" Text="{StaticResource String1}" />
25
répondu scrat789 2011-08-18 08:51:59

je pense que cela fonctionnera pour vous

<TextBlock Text='{StaticResource String1}'Typography.Capitals="AllSmallCaps"/>

Pour les polices de capitales énumérations https://msdn.microsoft.com/en-us/library/system.windows.fontcapitals(v=vs. 110).aspx

17
répondu Alias Varghese 2016-11-08 04:30:29

C#:

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}}"/>
9
répondu Max 2016-11-07 09:38:42

j'ai créé une propriété attachée et convertisseur pour cela. Vous avez probablement déjà le convertisseur, donc remplacez ma référence à CaseConverter par n'importe quelle implémentation que vous avez.

la propriété ci-jointe est juste un booléen que vous définissez si vous voulez qu'il soit en majuscules (vous pouvez évidemment étendre ceci à une énumérable pour une sélection de styles). Lorsque la propriété change, elle réinitialise la propriété Text de la zone de texte au besoin, en ajoutant le convertisseur.

Un peu de travail devra être fait lorsque la propriété est déjà liée - ma solution suppose qu'il s'agit d'une simple liaison de chemin. Mais il peut aussi avoir besoin de dupliquer la source, etc. Cependant je sentais que cet exemple est assez pour me faire face.

Voici la propriété ci-jointe:

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);
        }
    }
8
répondu Lauren 2013-03-25 13:07:22

ceci ne répond pas strictement à la question mais fournit une astuce pour causer le même effet.

je crois que beaucoup de trouver leur chemin ici cherchent comment faire cela avec un style. Textlock est un peu délicat ici parce que ce n'est pas un contrôle mais un Frameworkkelement et donc vous ne pouvez pas définir un modèle pour faire le tour.

la nécessité d'utiliser tout le texte en majuscules est très probable pour les titres ou quelque chose comme cela où L'utilisation de L'étiquette est justifiée. Ma solution est:

<!-- 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}" />

notez que cela désactive une partie du comportement par défaut de Label, et ne fonctionne que pour le texte, donc je ne le définirais pas comme par défaut (personne ne veut probablement que toutes les étiquettes soient en majuscules de toute façon). Et bien sûr, vous devez utiliser Label au lieu de Textlock lorsque vous avez besoin de ce style. En outre, Je ne voudrais pas utiliser cela à l'intérieur d'autres gabarits, mais seulement strictement comme un style de sujet.

2
répondu Ahe 2015-08-14 07:29:54

vous pouvez caser toutes les entrées dans les commandes TextBox avec la propriété suivante:

<TextBox CharacterCasing="Upper"

Pour s'appliquer à tous les contrôles de zone de texte dans l'ensemble de l'application créer un style pour tous les contrôles de zone de texte:

<Style TargetType="{x:Type TextBox}">
  <Setter Property="CharacterCasing" Value="Upper"/>
</Style>
-2
répondu Pascalsz 2012-08-21 10:14:51