Как сделать весь текст заглавными / прописными? - PullRequest
32 голосов
/ 19 ноября 2009

Я хочу, чтобы все тексты в TextBlock, Label, MenuItem.Header отображались в верхнем регистре. Строки взяты из ResourceDictionary например:

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

и т.д.. (также для Label и других элементов управления)

Я не могу использовать конвертер значений, потому что нет привязки. Я не хочу вводить строчные буквы в самом словаре.

Ответы [ 7 ]

32 голосов
/ 19 ноября 2009

Вы все еще можете использовать конвертер, просто установите текстовое значение в источнике привязки:

<TextBlock Text="{Binding Source={StaticResource String1},  Converter ={StaticResource myConverter}}"/>
31 голосов
/ 07 июня 2011

Вместо использования конвертера вы можете использовать тег CharacterCasing в TextBox, но в вашем случае он не работает с TextBlock.

<TextBox CharacterCasing="Upper" Text="{StaticResource String1}" />
23 голосов
/ 20 января 2016

Я думаю, что это будет работать для вас

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

Для перечисления прописных букв шрифта https://msdn.microsoft.com/en-us/library/system.windows.fontcapitals(v=vs.110).aspx

12 голосов
/ 24 апреля 2015

Чтобы завершить ответ Питера (мое редактирование было отклонено), вы можете использовать конвертер, подобный этому:

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}}"/>
8 голосов
/ 25 марта 2013

Я создал прикрепленное свойство и конвертер для этого. Возможно, у вас уже есть конвертер, поэтому замените мою ссылку на CaseConverter на любую имеющуюся у вас реализацию.

Присоединенное свойство - это просто логическое значение, которое вы устанавливаете, если хотите, чтобы оно было в верхнем регистре (вы, очевидно, могли бы расширить его, чтобы вместо этого быть перечисляемым для выбора стилей). Когда свойство изменяется, оно связывает свойство Text TextBlock по мере необходимости, добавляя в конвертер.

Может потребоваться немного больше работы, когда свойство уже связано - мое решение предполагает, что это простая привязка Path. Но может потребоваться дублирование источника и т. Д. Однако я подумал, что этого примера достаточно, чтобы донести свою мысль.

Вот прикрепленное свойство:

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);
        }
    }
2 голосов
/ 14 августа 2015

Это не дает точного ответа на вопрос, но дает хитрость, чтобы вызвать тот же эффект.

Я полагаю, что многие, находящиеся здесь, ищут, как это сделать со стилем. TextBlock здесь немного сложнее, потому что это не элемент управления, а FrameworkElement, и поэтому вы не можете определить шаблон, чтобы выполнить свою задачу.

Необходимость использования всего заглавного текста наиболее вероятна для заголовков или чего-то подобного, где использование метки оправдано. Мое решение было:

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

Обратите внимание, что это отключает некоторые стандартные свойства Label по умолчанию и работает только для текста, поэтому я бы не стал определять это как значение по умолчанию (в любом случае никто не хочет, чтобы все метки были заглавными). И, конечно, вы должны использовать Label вместо TextBlock, когда вам нужен этот стиль. Также я бы не использовал это внутри других шаблонов, но только строго как стиль темы.

0 голосов
/ 21 августа 2012

Вы можете поместить весь ввод в элементы управления TextBox со следующим свойством:

<TextBox CharacterCasing="Upper"

Чтобы применить ко всем элементам управления TextBox во всем приложении, создайте стиль для всех элементов управления TextBox:

<Style TargetType="{x:Type TextBox}">
  <Setter Property="CharacterCasing" Value="Upper"/>
</Style>
...